Googleスプレッドシート QUERY関数 超応用例 11(日付、日時、時刻を扱う)
Googleスプレッドシートの最強集計関数 QUERY関数について書いたnoteの第11回です。
👇これまでのQUERY関数シリーズは マガジンにまとめています。QUERY関数をハイレベル(廃レベル)に使いこなしたい人は必読です!
前回は小ネタシリーズ(QuickTips)の1回目、Googleスプレッドシート のチェックボックスやプルダウンをDeleteボタンで削除されないようにする方法を紹介しました。
QUERY関数における 特殊な型 日付・日時・時刻
QUERY関数シリーズとして、これまで select句、where句の仕様の解説や数多くの事例(お題)を取り上げてきました。
今回からは、これまで触れてこなかった
QUERY関数における 日付、日時、時刻の3つの型 の扱い
について書いていきます。(今回は超応用ではなく基本です)
QUERY関数で 日付・日時・時刻を扱う際に覚えておくべき4つのポイント
QUERY関数で、日付・日時・時刻の型を扱う際のポイントは以下の4つです。
日付・日時・時刻のリテラル 記述ルールを理解する
日付・日時・時刻で比較演算子が使えることを理解する
日付・日時・時刻を加工できるスカラー関数を理解する
日付・日時・時刻で文字列比較演算子を使う方法を理解する
今回は、1と2を 解説します。3,4は次回。
集計には欠かせない QUERY関数の日付データの取り扱い

select句、where句の解説を終えたこのタイミングで、QUERY関数の日付データを取り上げたのは理由があります。
それは、この後 group by 句、pivot句といった QUERY関数の集計を学ぶにあたり、日付の取り扱いが重要である為です。
実データの集計において、年ごと、月ごと、日ごと の集計、さらに四半期ごと、曜日ごと といった集計は 必ず発生します。
日付、日時、時刻の扱いを事前にしっかり理解し、QUERY関数の集計を自由自在に使いこなしちゃいましょう!
QUERY関数で 日付・日時・時刻の型は 親戚くらいの関係性
QUERY関数で扱える型は
数値 number
文字列 string
ブール値 boolean
日付 date
時刻 timeofday
日時 datetime
この6つがあります。
こちらに関してはQUERY関数シリーズの第2回でも詳しく触れました。
この中で、
日付 date
時刻 timeofday
日時 datetime
この3つは別の型ではありますが似た部分もあったり、完全に別の型とは言い切れない部分もあります。
親戚のような関係性と言えるかもしれません。
後半で触れますが、日付や日時で 比較演算子を使った時も、親戚のような関係性を感じることが出来ます。
日付・日時・時刻 はQUERY関数で そのまま出力できる

QUERY関数における 日付、日時、時刻の扱いが特殊といっても、第1引数の範囲(配列)に 日付、日時、時刻 のデータの列があって、これをそのまま出力するだけならば、特に型を意識する必要はありません。

元データの 日付の表示形式が yyyy年mm月dd日(ddd) であれば、QUERY関数で出力される表示もその形式が適用されます。
仮に、その中の一部の日付がシリアル値(数値)表示になっていたとしても、列の大多数が日付型で QUERY関数が その列を日付と判断した場合は、自動で シリアル値が日付表示に変換されて出力となります。
日付、日時、時刻 の型を意識する必要があるケースは、
where句の条件で 日付・日時・時刻を使用したい
日付・日時・時刻 を直接指定で select句で出力したい
日付・日時・時刻をスカラー関数で加工したい
こんな時です。
シート上の日付、中身は「シリアル値」

ExcelやGoogleスプレッドシートでは、シート上で扱う日付や日時は裏側でシリアル値という数値として処理されています。
DATEVALUE関数で日付をシリアル値に変換するとわかりますが、Googleスプレッドシートの場合は 1899/12/31 を 1 として、そこから1日を 1とカウントしたルールとなっています。
たとえば
今年 2025/07/01 は 45839
フランス革命開始日と言われる 1789/07/14 は -40345
と なります。
1日より小さい単位の 時間や分、秒は小数点以下の数値として扱われます( 1時間は 24分の1で 0.041666… )
ちなみにマイナスのシリアル値という考え方があることで、1899/12/31より前も日付として扱えるのはGoogleスプレッドシートの強みです。
ただ、なぜか YEAR関数ではマイナスシリアル値から年の数値が 取り出せません。

しかしTEXT関数を使って年を(文字列として)取り出すことは可能です。

なお Excelの場合は
■Googleスプレッドシートと違って DATEVALUE関数は 日付文字列にのみ使用できて日付データには使えない
■1900/01/01 を 1として、そこから1日を 1とカウント。(Excel 1900年を誤ってうるう年としている問題)
■1900/01/01 以前の日付は 日付として扱えない(マイナスのシリアル値は扱えない)
という仕様になっており、後発のGoogleスプレッドシートの方が日付の扱いが柔軟であるという利点があります。
話が少し反れましたが、日付の中身がシリアル値という1日を1とした「数値」であることで、日付に対しても四則演算や数値を引数とする関数を使うことが出来ます。

このように日付に3を足すだけで 3日後の日付を出力したり、日付同士の引き算で日数を求めたり、INT関数で小数部分(時刻部分)を切り捨てて、日時データを日付にしたり。
シート上であれば日付に対する計算処理が、非常に簡単に出来るようになっています。
QUERY関数 クエリ文の中では「シリアル値」という考え方は通じない
一方 QUERY関数のクエリ文の中は、スプレッドシートとは違う理(ルール)の世界です。
日付データに対して、シリアル値という考え方は通じません。
まず 日付、日時、時刻 の型は、数値型とは別モノとして扱われる為、四則演算が使えません。
例えば開始日(Col1)の3日後を表示させたいと思って

Col1 + 3 としても 、Col1 が日付型 なので 数値でないから sum(加算)が使えないとエラーになりますし
終了日(Col2)から開始日(Col1)を引いて 日数を取得したいと、
Col2 - Col1 とした場合も

エラーとなります。
QUERY関数 で日付を加工するには、スカラー関数を使うしかありません。
ただ、スカラー関数を使えば QUERY関数内の記述だけで 指定した日付列の3日後を出力することも可能なんですが、正直手間がかかりすぎて実用的とは言えません。(一応次回触れますが)
日付を加工するような処理は、QUERY関数が適さないケースが多いってことです。
日付の処理は一度クエリ文の外、つまりシート関数で日付を加工処理してから再びクエリに戻してあげるという方法をとることが多いです。
シート上の日付や日時とクエリ文の日付・日時は、扱い方が違うということを覚えておきましょう。
1a. 日付リテラルの 記述ルールを理解する
それでは 4つのポイントに入っていきます。
まずは、クエリ文でもっとも利用する機会の多い 日付の 記述形式を理解しましょう。

👆セルに入った日付データは、QUERY関数のクエリ文でそのまま日付として使うことが出来ません。
日付(日時、時刻)リテラルとして扱う為の お作法 を理解する必要があります。
それが
■QUERY関数 クエリ内の日付・日時・時刻 リテラル
日付: date 'yyyy-MM-dd'
日時: datetime 'yyyy-MM-dd HH:mm:ss[.sss]'
時刻: timeofday 'HH:mm:ss[.SSS]'
これです。
where句で 日付や日時を条件として指定する場合は、このルールに則った記述が必須となります。
たとえば日付の場合は date の後ろに シングルクォートで括った ハイフン区切りの 年-月-日 を記述するというルールになっています。
例えば 2025年7月1日 を日付としてクエリ内で記述したい場合は
date '2025-07-01'
と書きます。
※ 月、日は2桁である必要はなく date '2025-7-1' としてもOKです

QUERY関数の日付リテラルの書き方は、わりとメジャーなんで知ってる人も多いかと思います。
でも 日時や時刻リテラルの書き方は初めて見たという人も多いんじゃないでしょうか?
知ってる人には簡単かもしれませんが、お題形式で理解を深めていきましょう!
Q1. 日付を直接記述してwhere句の条件にしたい

たとえば 左のようなデータから 日付(列1)が 2025/6/30 であるデータのみをQUERY関数で抽出したい場合どうすればよか?
以下のサンプルデータをA1を起点にペーストして利用ください。
日付 担当 売上
2025/06/28 A 300
2025/06/28 B 200
2025/06/28 C 150
2025/06/29 A 400
2025/06/29 B 500
2025/06/29 C 500
2025/06/30 A 350
2025/06/30 C 300
2025/07/01 A 450
2025/07/01 B 400
2025/07/01 C 500
2025/07/03 A 150
2025/07/03 B 400
2025/07/03 C 450
2025/07/05 A 400
2025/07/05 B 500考えてみましょう!
↓↓
回答はここから。
↓↓
A1. 日付を直接記述してwhere句の条件にする
回答です。QUERY関数の式は

=QUERY(A1:C17,"where Col1 = date '2025-06-30'")
こうなります。 これは簡単ですね。
先ほど書いた通り、1列目が 2025/6/30 と「一致する」を条件として抽出したいので
1⃣
まず文字列である クエリ文の開始は ダブルクォート、
絞り込みなのでwhere句 を記述し
対象が1列目なので Col1 を指定
一致を条件とするので = とします
" where Col =
2⃣
イコールの後に日付リテラルのルールに則り date を記述
間に適度にスペースをいれましょう
" where Col1 = date
3⃣
その後の日付は前後を '(シングルクォート)で括って 、
年・月・日を - (ハイフン)区切りで記述します。
※シングルクォート内は余計なスペースはいれない!
" where Col1 = date '2025-06-30'
4⃣
最後にダブルクォートを閉じる
" where Col1 = date '2025-06-30' "
ここは大丈夫ですね?
Q2.セルの日付をwhere句の条件にしたい

次にクエリ文の中に直接日付を記述するのではなく、where句で条件として使う日付をセル参照したい場合はどうすればよいか?にチャレンジしてみましょう。
A1:C17のデータは同じものを使用し、上のように E1 セルの日付が1列目と一致することを where句の条件として、 QUERY関数で式を作ってみましょう。
考えてみましょう!
↓↓
回答はここから。
↓↓
A2. セルの日付をwhere句の条件にする
回答です。

=QUERY(A1:C17,"where Col1 = date "&TEXT(E1,"'yyyy-MM-dd'"))
セルの日付を参照して 先ほど記載したシングルクォートで括った ハイフン区切りの日付表記の文字列
date '2025-06-29'
を生成する為に、シート関数のTEXT関数を組み合わせます。
date は固定なので 直接記述として、その後を
TEXT(E1,"'yyyy-MM-dd'")
TEXT関数の第2引数を "'yyyy-MM-dd'" として、クエリ文の中の date の後ろにくる シングルクォート付きハイフン区切りの日付文字列を生成しています。
※プログラミングでは月を表すMMと分を表すmmは大文字・小文字で区別されますが、TEXT関数ではMMとmmは区別されません。公式にならって大文字を使ってますが、'yyyy-mm-dd'としてもOKです。
mirの おススメは このようにシングルクォートもTEXT関数内で付与する書き方なんですが、

=QUERY(A1:C17,"where Col1 = date '"&TEXT(E1,"yyyy-MM-dd")&"'")
このようにシングルクォートを外側でつける記述で式を書く人が多い印象。
これはたぶん「いつも隣にITのお仕事」さんのQUERY関数紹介記事が非常に影響力があった為と思われます。
どちらも機能するんで好きな方で記述すればいいんですが、mirはシングルクォートをTEXT関数に入れ込んだ方がシンプルで好きです。

where句の条件として使用する日付をセル参照とすれば、ダブルクリックで日付ピッカーが起動し、クリックで選ぶだけで その日付を条件としたQUERY関数の結果を出力させることが出来ますね。
ちなみに今回は クエリ文がちょうど TEXT関数の結果で終了しているので
=QUERY(A1:C17,"where Col1 = date "&TEXT(E1,"'yyyy-MM-dd'"))
このように綺麗に終わってますが、この後にさらにクエリ文が続く場合は、

=QUERY(A1:C17,"where Col1 = date "&TEXT(E1,"'yyyy-MM-dd'")&
" and Col2='"&F1&"'")
このようにTEXT関数の後ろに &"クエリ文続き" とその後のクエリ文の続きを記述した文字列と&で連結します。
where句を 複数条件とする場合は、 and や or で繋ぐ、そして適切にスペースを入れることを忘れずに!
Q3. 本日の日付をwhere句の条件にしたい
日付がセル参照ではなく、1列目(日付列)が本日の日付と一致するデータを出力したい場合は、どのような式を作ればよいでしょうか?

問2とほぼ同じです。さくっと考えてみましょう!
↓↓
回答はここから。
↓↓
A3. 本日の日付をwhere句の条件にする
回答です。

=QUERY(A1:C17,"where Col1 = date "&TEXT(TODAY(),"'yyyy-MM-dd'"))
セル参照の E1の箇所を TODAY()関数とすれば、常に今日の日付を条件になりますね。
よく使う 日付の一致を where句の条件とした3パターンでした。
Q4. セルで指定した日付を select句で列として出力したい
日付リテラルは where句で使うことが多いんですが、実は select句で使うこともできます。
QUERY関数シリーズの第5回で、select句は 単体の値を指定することも出来ることを紹介しました。

これを 日付でも使ってみましょう。

QUERY関数でA1:C17のデータの左側に1列追加し、E1セルで指定した日付を表示させるにはどうすればよいでしょうか?
考えてみましょう!
↓↓
回答はここから。
↓↓
A4. セルで指定した日付を select句で列として出力する
回答です。

=QUERY(A1:C17,"select "&TEXT(E1,"'yyyy-MM-dd'")&",Col1,Col2,Col3 ")
先ほどwhere句で使った 日付リテラル となるTEXT関数の式を select句で使えばよいですね。
このように 日付を直接 selectで出力するケースはあまり無いんですが、次回登場するスカラー関数の dateDiff() と TODAYを 組み合わせて

本日時点で まだ「完了」になっていないタスクを抽出しつつ、期限まで 残り 〇日といったカウントダウン列を生成。
なんてことも可能となります。
1b. 日時・時刻リテラルの 記述ルールを理解する
日付ほど使う機会は多くありませんが、日時、時刻のリテラルも理解しておきましょう。
■QUERY関数 クエリ内の日付・日時・時刻 リテラル
日付: date 'yyyy-MM-dd'
日時: datetime 'yyyy-MM-dd HH:mm:ss[.sss]'
時刻: timeofday 'HH:mm:ss[.SSS]'
👆 日付と同じようにこちらの形式に則って記述すればOKです。
Q5. 日時を直接指定してwhere句の条件にしたい

まずはQUERY関数でクエリ文内に直接記述した日時に一致するデータを抜き出す式を作ってみましょう。
👆上の画像のように 2列のデータから 1列目の開始日時が
2025/7/22 11:41
と一致するデータを抽出したい場合、どのようなQUERY関数の式を組めばよいでしょうか?
データはこちらをご利用ください。
開始日時 テキスト
2025/06/29 0:15 A
2025/06/30 0:01 B
2025/07/09 8:25 C
2025/07/22 11:41 D
2025/07/03 20:08 E
2025/07/04 10:10 F
2025/07/05 16:50 G考えてみましょう!
↓↓
回答はここから。
↓↓
A5. 日時を直接指定してwhere句の条件にする
回答です。

=QUERY(A1:B8,"where Col1 = datetime '2025-07-22 11:41:00'")
👆ポイントは 秒を必ず記述する必要があるという点です!
クエリ文の日時リテラルの記述ルールは
日時: datetime 'yyyy-MM-dd HH:mm:ss[.sss]'
こちらです。
これは

このような意味合いになっています。
まず冒頭部分は 日時の場合は datetime と記述します。
その後、シングルクォートで括って 日時文字列を記述するのですが、
日付部分は 日付リテラルと同じで ハイフン区切りで 年-月-日 とし、
日付と時刻部分の間に 半角スペースを入れて 時刻部分は :(コロン)区切りで 時:分:秒 と記述します。
この時、秒は不要だったり省略されている場合でも必ず 秒も入れて記述をします。
2025/7/22 11:41 ▶ '2025-07-22 11:41:00'
秒を省略して記述するとエラーが返ります。

対象列が 秒を表示してなかったとしても、必ず 00 と秒も記述する必要があるってことです。
今回のお題では使いませんでしたが、[.sss] は秒より小さい時間の単位、ミリ秒を表しています。
この [ ]部分は省略できるよ~って意味です。実際にミリ秒を記述する際は [ ] は付けません。

=QUERY(A1:B8,"where Col1 = datetime '2025-07-22 11:41:00.123'")
ちなみにスプレッドシート上で ミリ秒まで表示させる為には条件付き書式のカスタム数値形式で

yyyy/mm/dd h:mm:ss.000
と指定するか、カスタム日時で

秒の後ろに . を入れてから 1/1000の精度のミリ秒を入れます。
条件とする日時をセル参照する場合は、日付の時と同じく TEXT関数でシングルクォートで括られた日時文字列を生成します。(ほぼ同じなのでお題にはしません)

=QUERY(A1:B8,"where Col1 = datetime "&
TEXT(D1,"'yyyy-MM-dd HH:mm:ss'"))
日時を一致条件で指定するケースは滅多にありませんが、この後登場する不等号(比較演算子)と組み合わせることは稀にあるかもしれません。
Q6. セルで指定した時刻をwhere句の条件にしたい
時刻型のケースもお題にチャレンジしてみましょう。
時刻リテラルは
時刻: timeofday 'HH:mm:ss[.SSS]'
このように書きます。日時とほぼ一緒です。

上の画像のように D1セルの時刻と 開始時刻(1列目)が一致するデータをQUERY関数で出力したい場合、どのような式を記述すればよいでしょうか?
開始時刻 テキスト
0:15 A
0:01 B
8:25 C
11:41 D
20:08 E
10:10 F
16:50 G👆データはこちらをA1に貼り付けて利用ください。
考えてみましょう!
↓↓
回答はここから。
↓↓
A6. セルで指定した時刻をwhere句の条件にする
回答です。

=QUERY(A1:B8,"where Col1 = timeofday "&TEXT(D1,"'HH:mm:ss'"))
時刻の場合は 頭に timeofday を付けてから シングルクォートで 時刻部分を:(コロン)区切りで 記述します。
日時と同じく 秒まで記述する必要があります。
日時、時刻のリテラルは滅多に使わないので、記述方法を 忘れてしまった場合は、このnoteか 公式を確認すると良いでしょう。
https://developers.google.com/chart/interactive/docs/querylanguage?hl=ja#language-elements
2. 日付・日時・時刻で比較演算子が使えることを理解する
クエリ文の中で 日付・日時・時刻 をそのまま(リテラルとして)扱う場合は、記述のお作法があることは理解出来ましたね。
前述しましたが、シート上と違って + や - など算術演算子(四則演算)は日付や日時に対して使うことは出来ません。
しかし < や <= 、> や >= など 比較演算子の不等号で、日付や日時の 大・小 比較をすることは可能です!
まあ、比較演算子の不等号での大小判定は 文字列に対しても使えるんだから、日付や日時に不等号が使えるのは当然っちゃ当然ですね。
QUERY関数 超応用例 8 3.不等号 <=, <, >=, > は数値以外にも使える
日付や日時と不等号を組み合わせた条件設定は、QUERY関数では非常によく使う鉄板の組み合わせです。
お題形式で理解を深めていきましょう!
Q7. セルで指定した2つの日付の期間内のデータを抽出したい

まずは 日付と不等号の組み合わせの基本といえる、2つの日付の間の期間に合致するデータを抽出するお題にチャレンジしてみましょう。
対象データは お題1で使ったものを利用します。
日付(1列目)が E1セルの日付以降 かつ G1 セルの日付以前のデータを抽出したい(E1~G1の期間に含まれる日付を抽出したい)場合、QUERY関数でどのような式を作成すればよいでしょうか?
E1、G1の日付と一致するものも含む(以上、以下で判定)とします。
考えてみましょう!
↓↓
回答はここから。
↓↓
A7. セルで指定した2つの日付の期間内のデータを抽出する
回答です。

=QUERY(A1:C17,"where Col1 >= date "&TEXT(E1,"'yyyy-mm-dd'")&" and Col1 <= date "&TEXT(G1,"'yyyy-mm-dd'"))
ちょっと冗長な式になりますが、正攻法でいくと👆こんな式になります。
これは大丈夫ですね?
リテラルの記述ルールで学んだ date "&TEXT(E1,"'yyyy-mm-dd'") を使って
"where
Col1 >= date "&TEXT(E1,"'yyyy-mm-dd'") &
" and
Col1 <= date "&TEXT(G1,"'yyyy-mm-dd'")
このように2つの条件を and で繋ぐことで、E1以降かつG1以前の日付だけを抽出しています。
【別解】2つの日付の期間内を抽出する式をスッキリさせたい
このようにQUERY関数のクエリ文で2つ以上の日付が登場すると、どうしても式(クエリ文)が冗長になってきます。
たこれをスッキリ書きたいと思っても、そこまで良い方法はありません。
幾つか別解として紹介しますが。

=LET(f,LAMBDA(a,"date "&TEXT(a,"'yyyy-mm-dd'")),
QUERY(A1:C17,"where Col1 >= "&f(E1)&" and Col1 <= "&f(G1)))
1つは "date "&TEXT(a,"'yyyy-mm-dd'") 部分を LETとLAMBDAで式内名前付き関数として定義してしまう方法。
上の式は f という名前付き関数にすることで
f(E1) → date '2025-06-29'
とf関数でリテラル部分を生成できるようにしています。
これがもっとも汎用性が高いです。
3回以上 "date "&TEXT(a,"'yyyy-mm-dd'") を記述する必要があるクエリ文ならおススメ。
他に
=QUERY(A1:C17,"where "&ARRAYFORMULA(JOIN(" and ",
TEXT({E1,G1},"Col1 "&{">=","<="}&" \dat\e 'yyyy-MM-dd'"))))
このようにTEXT関数内の配列式 と JOINを使う方法や
○○以上、○○以下を判定できるExcelにはない ISBETWEEN関数を使って
=ARRAYFORMULA(QUERY({ISBETWEEN(A1:A17,E1,G1),A1:C17},"select Col2,Col3,Col4 where Col1 = TRUE"))
このような式にすることも出来ます。
ただ、そこまで簡略化されない上に 数式が読み解きづらくなるんでおススメしません。
Q8. 毎日のタイムスケジュールから、これ以降にやることだけを表示さたい

もう1つ 時刻と不等号を使ったお題をいってみましょう。
👆上のようにA1:B19 の毎日のタイムスケジュールから、これからやること(現在の時刻以降のやること)をQUERY関数で表示させたい場合、どのような式を組めばよいでしょうか?
👇サンプルデータ
時間 やること
7:00 起床
7:30 朝ごはん
8:00 通勤
9:00 午前の仕事
10:30 休憩
10:40 午前の仕事2
12:00 お昼
13:00 午後の仕事
15:00 おやつタイム
15:30 午後の仕事2
17:30 退社
18:00 ジム
19:00 帰り
20:00 夕飯
21:30 風呂
22:00 ストレッチ
22:30 読書
23:20 就寝考えてみましょう!
↓↓
回答はここから。
↓↓
A8. 毎日のタイムスケジュールから、これ以降にやることだけを表示させる
回答です。

=QUERY(A1:B19,
"where Col1 >= timeofday "&TEXT(NOW(),"'HH:mm:ss'"))
NOW関数で取得した現在の日時を TEXT関数で '時:分:秒' の形式の文字列に変換、timeofday を頭に付け 時刻リテラルとして >= と組み合わせて 以上という条件にしています。
日時や時刻は イコール(一致)よりも 以上や以下といった条件と組み合わせることが多いですね。
【Point】日付・日時・時刻 は 型をまたいで比較演算子が使える
QUERY関数シリーズの第8回 where句の比較演算子の挙動を学ぶ回で、型の違うものどうしは 比較が出来ないことを学びました。
QUERY関数 超応用例 8 5.違う型は比較ができない
つまり、数値の 0 と 日付 2025/07/05 を比較した時、感覚的には 2025/07/05 の方が大きいのですが、これは型違いで比較が成り立たないと判断され、なにも出力されません。

しかし日付・日時・時刻 の3つの型は、完全に別の型とは言い切れない、親戚のような関係性と書いた通り、日付・日時・時刻 は 型をまたいで演算子が利用できます。(一部例外あり)
たとえば 日時データの1列目に対して

=QUERY(A1:B8,"where Col1 = date '2025-06-30'")
このように日付型 の date '2025-06-30' と一致するを条件とした場合でも、2025/06/30 0:00 が一致するとみなされ出力されます。
これは 日付 2025/06/30 は 日時 2025/06/30 00:00:00 と同じものとして扱われる為です。
同じように時刻型の列に対しては、

=QUERY(A1:B8,"where Col1 > date '1899-12-30' and
Col1 < date '1899-12-31'")
このように 1899-12-30 より大きく 1899-12-31 より小さい という条件で全て抽出できることから
日付部分のない 時刻は、日付や日時と比較演算子で比較する際は
1899-12-30 の日時データとして扱われる
ということがわかります。
セルに入っている 時刻 16:50 は、1899/12/30 16:50 と見なされるってことですね。
これは 1899/12/30 がシリアル値 0 であることに起因している為と思われます。
ただし 「一部例外あり」と書きましたが、セルに書かれた時刻ではなく、クエリ内で直接記述された時刻は扱いが別で 日付や日時の型と比較することが出来ません。

基本的には型違いでの比較は 日付と日時で利用することが多いので、あまり気にする必要はありませんが、一応注意しましょう。
日付と日時は連合を組む挙動の時も時刻だけは乗ってこなかったし、時刻だけは3つの中でも遠縁なのかもしれませんw
QUERY関数を活用している人でも、なんとなく日時データの列に対して日付を条件として 比較演算子を使ったりしてないでしょうか?
あまり意識せず使っているかもしれませんが、これは 型違いのデータを比較するイレギュラーな処理であることを 少しだけ意識しても良いかもしれません。

この型をまたいだ比較が活躍するのが、シート上の日時データに対して日付を条件とする場合、たとえばGoogleフォームの回答のタイムススタンプ列を対象に 日付指定で絞り込みたい場合です!
Q9. Googleフォームの回答データから QUERY関数でタイムスタンプの日付を条件として抽出したい

それでは今回の最後のお題です。
Googleフォームの回答が アンケート回答 というテーブルで出力されています。1列目はタイムスタンプとなっています。
この時、タイムスタンプの日付部分が D1に入れた日付と一致するものをQUERY関数で抽出するにはどのような式を組めばよいでしょうか?
データは 👇をA1セルにコピペして、「アンケート回答」という名前のテーブルにしてご利用ください。
タイムスタンプ 回答者
2025/02/25 15:11:08 田中さん
2025/03/11 15:21:50 佐藤さん
2025/03/11 15:27:40 山田さん
2025/03/13 15:19:06 鈴木さん
2025/03/13 15:23:57 小林さん
2025/03/13 15:24:20 加藤さん
2025/03/13 15:26:12 吉田さん
2025/03/13 15:26:39 中村さん
2025/03/14 7:51:17 木村さん
2025/03/19 15:12:12 斉藤さん
2025/03/19 15:18:41 松本さん
2025/03/19 15:18:51 井上さん
2025/03/19 15:19:11 林さん
2025/03/19 15:59:06 清水さん
2025/03/27 15:18:16 山口さん
2025/03/27 15:18:26 池田さん
2025/03/27 15:27:44 橋本さん
2025/03/28 12:14:04 前田さん
2025/03/28 14:09:52 鎌田さん考えてみましょう!
※スカラー関数を使うテクニックを知ってる人も 今回は 比較演算子を使うという縛りでお願いします
↓↓
回答はここから。
↓↓
A9. Googleフォームの回答データから QUERY関数でタイムスタンプの日付を条件として抽出する
回答です。

=QUERY(アンケート回答[#ALL],
"where Col1 >= date "&TEXT(D1,"'yyyy-MM-dd'")&
" and Col1 < date "&TEXT(D1+1,"'yyyy-MM-dd'"))
D1セルが 2025/03/13 だった時、クエリ文は
where Col1 >= date '2025-03-13' and Col1 < date '2025-03-14'
このような文字列となっています。
お題7で2つの日付の期間内のデータの抽出を学びましたが、その応用ですね。
ポイントは 日時データから 日付部分が 2025/03/13と一致するを条件とする場合は
Col1 >= date '2025-03-13'
2025-3-13 00:00:00 以上
かつ
Col1 < date '2025-03-14'
2025-3-14 00:00:00 より前(小さい)
としています。これによって
2025-03-13 00:00:00 ~ 2025-03-13 23:59:59
の期間に該当するデータ = 日時の日付部分が 202-03-13 と合致するデータ を抽出しているわけです。
しかし日時データの日付を条件にするだけでもなかなか大変ですね。
FILTER関数ならさくっとINTで処理できるんですが・・・。

=FILTER(アンケート回答,INT(アンケート回答[タイムスタンプ])=D1)
ただ、実はスカラー関数を利用して今回の処理はもっと簡単に記述ができます。
この方法は次回、学んでいきます!
次回は QUERY関数で 日付・日時・時刻を扱う際に覚えておくべき4つのポイント 後半
QUERY関数で、日付・日時・時刻の型を扱う際の4つのポイントの
日付・日時・時刻のリテラル 記述ルールを理解する 👈今回理解
日付・日時・時刻で比較演算子が使えることを理解する 👈今回理解
日付・日時・時刻を加工できるスカラー関数を理解する
日付・日時・時刻で文字列比較演算子を使う方法を理解する
今回は1,2を お題形式で学びました。
■QUERY関数 クエリ内の日付・日時・時刻 リテラル
日付: date 'yyyy-MM-dd'
日時: datetime 'yyyy-MM-dd HH:mm:ss[.sss]'
時刻: timeofday 'HH:mm:ss[.SSS]'
日付だけでなく、日時、時刻リテラルも理解できましたね。
次回は 後半、3,4を理解していきましょう!
いいなと思ったら応援しよう!
チップ大歓迎です。やる気がアップしますw