質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.02%

ACCESSのクエリで時間の合計時間を出した時に変な数値になる。

解決済

回答 2

投稿 編集

  • 評価 0
  • クリップ 0
  • VIEW 209

ACCESSのクエリの集計を使って時間の合計を出しました。
●●:●●となっていて、何時何分だけの合計時間を足していったクエリを作成したいのですが、
結果的に【6.94444444444442E-03】という感じになってしまいます。

データ型は【日付/時刻型】で
書式【hh\時nn\分】としていて、それ同士を足し合わせているのですが、、、
この辺りのデータ型の部分に何か間違いがあるような気がするのですが、分からず
もしよろしければご教授頂けますと幸いです。

VBAの式
・開始時間:8:00
・終了時間:8:17

と入っていて、黄色の止まった場所にも開始時間、終了時間にはそれが入っているのですが、
【Me.tx_合計時間.Value】には、1990/01/20と入っていて、時間差の分が出ません。

イメージ説明

  • クリップを取り消します

  • 質問の評価を上げたことを取り消します

  • 質問の評価を下げたことを取り消します

質問への追記・修正、ベストアンサー選択の依頼

回答 2

checkベストアンサー

+1

Accessの 日付/時刻型 は日付と時刻を表すもので、時間を表すものではありません。
時刻と時間は別の概念というのは理解してますよね。(時刻は時間軸上の位置、時間は長さをあらわすものです。)

Accessには時間型というのはありませんので、テーブルに格納するときは分単位とか秒単位の数値に変換して格納することになります。書式【hh\時nn\分】としているとこうことは分単位で格納すればいいでしょう。

例えば、開始時刻 終了時刻 というのがあってそこから時間を計算する場合は、Datediff("n",[開始時刻],[終了時刻]) という式で分単位の時間に変換できます。これを集計することになります。

分単位の数値を hh時nn分という書式で表示するには、
[時間] \ 60 & "時" & [時間] Mod 60 & "分"
というような式で変換します。


Accessで時間を扱う場合の一例を提示しておきます。
(一つの例ですので他の方法もあります。)

テーブルに 開始時刻, 終了時刻 という日付/時刻型のフィールドがあるとします。
このテーブルからクエリを作成します。テーブル名は Tbl1 と仮定してます。

SELECT Tbl1.*, DateDiff("n",[開始時刻],[終了時刻]) As 時間 From Tbl1;


クエリ名は Qry1 と仮定します。
このクエリをフォームのレコードソースとします。このフォームで
開始時間:8:00
終了時間:8:17
と入力すると時間には、17 と分単位の数値が表示されます。

開始時間:8:00
終了時間:10:17

だと、137 と表示されます。137分という意味です。
これを、2時間17分と表示させたい場合は、テキストボックスを配置して、コントロールソースを下記のように設定します。

=[時間] \ 60 & "時間" & Format([時間] Mod 60, "00") & "分"


ここまでVBAは必要ありません。

この時間を集計クエリで集計したい場合もあると思います。その場合も時間を集計します。

SELECT
 Sum([時間]) AS 時間計,
 [時間計]\60 & "時間" & Format([時間計] Mod 60,"00") & "分" AS 時間計hn
FROM Qry1;


上記のクエリは全合計をだすように単純化してますが、必要に応じてグループ化してください。

時間計 には分単位の数値、時間計hn には h時間nn分という表示になります。

この式だと例えば、35時間17分 というような24時間以上の表示も可能です。
日付/時刻型ではこの表示は無理です。

投稿

編集

hatena19

VBA総合1位

score 21302

  • Reeeeeeeeeeeeee

    Reeeeeeeeeeeeee

    2021/04/27 08:30 編集

    ご丁寧に教えていただきありがとうございます。
    時刻と時間の概念の違いは考えたことありませんでした。ありがとうございます。

    上記で試してみたのですが、

    Me.tx_合計時間.Value = DateDiff("n", [開始時間], [終了時間])

    だと、

    [開始時間]には【8:00】と[終了時間]には【8:11】という時間が格納されているのですが、
    【Me.tx_合計時間.Value】という方には、【1990/01/11】という数値が入っていて、
    フォームではボタンを教えてもエラーが起きてしまい、うまく起動しません。

    開始時間と終了時間を【Me.tx_開始時間.Value = h & "時" & m & "分"】という方法で導いてきていることが原因なのでしょうか?

    どこを直せばよいのか、現状検討もつかず、お手数ですが、ヒントなど教えていただけますと幸いです。

    現在のVBAの式を追記で画像載せました。
    お手数ですが、よろしくお願いいたします。
  • Reeeeeeeeeeeeee

    Reeeeeeeeeeeeee

    2021/04/27 17:40 編集

    詳しく教えていただきありがとうございます。
    上記順番で試しているのですが、

    >>SELECT Tbl1.*, DateDiff("n",[開始時刻],[終了時刻]) As 時間 From Tbl1;

    の箇所で、クエリに

    式1: (SELECT Tbl1.*, DateDiff("n",[開始時刻],[終了時刻]) As 時間 From Tbl1;)

    と入れると、

    下記エラーが出てしまい、現状、再現ができない状況です。
    ちょっと自分にはまだサブクエリは難しく、
    少し勉強をしたいと思います。ありがとうございました。
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    メイン クエリのFROMの句の予約語EXISTSを使用しないフィールドを複数返すサブクエリを作成しました。サブクエリのSELECT ステートメントを変更し、1つのフィールドだけを指定してください。
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  • hatena19

    hatena19

    2021/04/28 08:08

    SQLコードなので、クエリのSQLビューに記述してください。
    デザインビューのフィールド欄に記述するなら、
    時間: DateDiff("n",[開始時刻],[終了時刻])
    です。

0

FormatDateTime関数で、

FormatDateTime([開始時間]+[追加時間])


と指定するか、
Format関数で、

Formtat([開始時間]+[追加時間],"hh:nn:ss")


と指定するか、してみましょう。

投稿

編集

seastar3

score 1975

  • hatena19

    hatena19

    2021/04/26 21:01

    24時間以内なら、その式でもいいのですが、24時間以上になる場合は、その式では破綻します。
  • seastar3

    seastar3

    2021/04/26 21:03

    hatena19さんの仰有るとおりですね。加算に修正します。
  • hatena19

    hatena19

    2021/04/26 21:11

    いや、そういう意味ではないです。
    クエリで集計しているとのことなので、集計値が24時間以上になることもあり得るのでそれを考慮する必要があるということです。
    また、FormatDateTime や Formtat で変換すると文字列になりますので、集計すること自体できなくなります。(日付/時刻型は内部的には浮動小数点数なので集計することはできます。)
  • seastar3

    seastar3

    2021/04/26 21:18 編集

    hatena19さん、そうですね。
    時間の差なら、シリアル値を単純に計算して、"[終了時間] + 1.0 - [開始時間]"の式で通用するのでしょうが、質問が指定した時間を足したものを出力したいということなので、差の問題は関係ないと判断して、単純に回答を修正しました。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる