Google スプレッドシートの QUERY 関数で「日付が◯◯以降の行だけ」を取り出そうとしたら、結果が0件になる、#VALUE! のエラーが出る、一部の行だけ漏れる——。日付の条件は QUERY でいちばんつまずきやすいところです。
先に結論です。QUERY のクエリ文の中では、日付を date 'yyyy-MM-dd' という決まった形で書きます。セルの日付を使うときは TEXT(セル,"yyyy-mm-dd") で文字列にしてから連結します。これは QUERY の文法が Google Visualization API のクエリ言語で、日付は「キーワード date のあとに yyyy-MM-dd 形式の文字列」と決められているためです。それでも漏れる行がある場合は、その列に文字列として入った日付が混ざっているのが原因です。
症状別:まずここを見る
症状 | よくある原因 | 直し方 |
|---|---|---|
0件になる | 日付を |
|
#VALUE! などのエラー | セルの日付をそのまま |
|
一部の行だけ漏れる | 列に文字列の日付が混ざり、NULL 扱いになっている | 元データを本物の日付に揃える |
月で絞ると1か月ずれる |
| 10月なら |
日時の列で当日分が欠ける | 時刻つきの値を日付だけで比べている |
|
① 日付は date 'yyyy-MM-dd' で書く
QUERY の第2引数(クエリ文)は、スプレッドシートの数式ではなく別の言語です。Google のヘルプ(QUERY 関数)も、クエリは「Google Visualization API のクエリ言語で記載」すると説明しています。その言語では、日付の書き方が次のように決まっています。
型 | 書き方 | 例 |
|---|---|---|
日付 |
|
|
日時 |
|
|
時刻 |
|
|
たとえば A 列が日付で、2026年10月1日以降の行を取り出すなら次のとおりです。
- ×:
=QUERY(A:C,"select * where A >= '2026/10/01'")(文字列との比較になり、0件) - ○:
=QUERY(A:C,"select * where A >= date '2026-10-01'")
区切りはスラッシュではなくハイフン、月と日は2桁です。date '2026-10-1' のような書き方は避けてください。
② セルの日付を条件にする(TEXT で文字列にする)
実務では「F1 に入れた日付以降」のように、条件をセルで変えたいことがほとんどです。このとき "... where A >= date '"&F1&"'" と書くと、F1 の日付はスプレッドシート内部のシリアル値(数字)として連結され、date '46296' のような意味のない文になります。
正しくは、TEXT 関数で yyyy-mm-dd の文字列にしてからつなぎます。
=QUERY(A:C,"select * where A >= date '"&TEXT(F1,"yyyy-mm-dd")&"'")
期間で絞るなら、開始と終了を2つのセルに置きます。
=QUERY(A:C,"select * where A >= date '"&TEXT(F1,"yyyy-mm-dd")&"' and A <= date '"&TEXT(G1,"yyyy-mm-dd")&"'")
「今日以降」は、セルに =TODAY() を置いて同じように参照するのが確実です。クエリ言語にも now() はありますが、リファレンスにはGMT(グリニッジ標準時)の現在日時を返すと書かれており、日本時間では朝9時まで前日扱いになります。
引用符が3種類(数式の "、日付リテラルの '、連結の &)並ぶので、うまくいかないときはクエリ文だけを別のセルに組み立てて、そのセルを QUERY の第2引数に渡すと確認しやすくなります。Google のヘルプも、クエリは「適切なテキストを含むセルへの参照」でもよいとしています。
③ 一部の行だけ漏れる:文字列の日付が混ざっている
条件は正しく書けているのに、特定の行だけ結果に出てこない。この場合は、その行の日付が「日付」ではなく「文字列」として入っていることを疑います。Google のヘルプには、QUERY の データ について次の説明があります。
1 つの列に異なる種類のデータが含まれている場合は、その列に大多数含まれる種類のデータをクエリに使用します。小数の種類のデータは NULL 値とみなされます。
つまり日付の列に、CSV の取り込みや手入力で文字列になった「2026/10/05」が混ざると、その値は NULL 扱いになり、どんな日付条件にも当てはまりません。見分け方は次の3つです。
=ISDATE(A5)が FALSE を返す- セルが左寄せになっている(日付・数値は既定で右寄せ)
- 表示形式を「数値」に変えても数字にならない
直し方は、元データを本物の日付に揃えることです。列を選んで「表示形式」→「数字」→「日付」に変えても直らない値は、=DATEVALUE(A5) で日付に変換した列を作り、その列を QUERY の対象にします。フォームや別システムから毎日データが入ってくる表なら、入口で形式を揃える方が長い目で見て楽です。
④ 月・年で絞る:month() は 0 始まり
クエリ言語には year()・month()・day() があります。ただし リファレンスにあるとおり、month() は 0 始まりで、1月が 0、2月が 1 を返します。
- 2026年10月の行:
where year(A) = 2026 and month(A) = 9 - 同じことを期間で書く:
where A >= date '2026-10-01' and A < date '2026-11-01'
ずれの事故を防ぐなら、後者の「期間」で書く方が読み間違えがありません。月ごとの件数を数えたいときは select year(A), month(A)+1, count(B) group by year(A), month(A)+1 のように、表示の段階で 1 を足します。
⑤ 日時の列で「当日分」が欠ける
A 列に「2026/10/24 14:30」のような時刻つきの値が入っていると、その列は日時(datetime)型です。ここに where A <= date '2026-10-24' と書くと、10月24日0時より後の行は含まれません。当日分まで含めたいときは、次のどちらかにします。
- 翌日の0時「未満」で指定する:
where A < date '2026-10-25' - 日付部分だけで比べる:
where toDate(A) <= date '2026-10-24'(toDate()は日時から日付の部分を取り出す関数)
IMPORTRANGE や配列と組み合わせるとき
別ファイルから IMPORTRANGE で取った範囲や、{A:A,C:C} のような配列を QUERY の データ に渡すと、列記号(A、B…)ではなく Col1、Col2 の表記で指定します。Google のヘルプにも、QUERY は「Col」表記と「A, B」表記のどちらも受け付けると書かれています。日付の書き方は同じで、where Col1 >= date '2026-10-01' となります。IMPORTRANGE が「読み込んでいます」のまま止まる場合はIMPORTRANGE が終わらない原因を先に確認してください。
なお、VLOOKUP で日付をキーにして #N/A になる場合も、原因は同じく「日付と文字列の混在」であることが多いです。VLOOKUPが#N/Aで見つからない原因5つもあわせてご覧ください。
日付で絞る表が増えてきたら
QUERY で「今月分」「担当者ごと」「期限切れ」を切り出すシートが何枚も増えてくると、どこかの数式が壊れたときに誰も直せない、という状態になりがちです。実務では、入口(フォームや入力シート)で日付の形式を揃え、集計は1か所にまとめるだけで、こうした事故の多くは防げます。
Mihata では、こうしたスプレッドシートを社内アプリの形に整える「スプレッドシートのアプリ化」もお手伝いしています。記事の途中で恐縮ですが、表の運用が重くなってきたと感じたら、よろしければご覧ください。
まとめ
- QUERY の中の日付は
date 'yyyy-MM-dd'(ハイフン区切り・2桁) - セルの日付は
TEXT(セル,"yyyy-mm-dd")で文字列にしてから連結する - 一部の行が漏れるなら、文字列の日付が混ざって NULL 扱いになっている
month()は 0 始まり。期間で書けばずれない- 日時の列は 翌日0時未満か
toDate()で当日分を含める
よくある質問
QUERY関数で日付を条件にすると0件になります。なぜですか?
QUERY のクエリ文の中では、日付は date "yyyy-MM-dd" という決まった形で書く必要があります。where A >= '2026/10/01' のように文字列で書くと、日付の列と文字列を比べることになり、条件に合う行がなくなります。where A >= date '2026-10-01' と書き直してください。
セルに入れた日付を条件に使うにはどう書けばいいですか?
TEXT 関数で日付を yyyy-mm-dd の文字列にしてから、クエリ文に連結します。例は =QUERY(A:C,"select * where A >= date '"&TEXT(F1,"yyyy-mm-dd")&"'") です。セルの日付をそのまま & でつなぐと、日付がシリアル値(数字)になってしまい、正しく比較できません。
一部の行だけ日付の条件から漏れます。
その列に、日付ではなく文字列として入っている値が混ざっている可能性があります。Google のヘルプでは、1つの列に異なる種類のデータが混在する場合、多数派の種類だけがクエリに使われ、少数派の値は NULL とみなされると説明されています。=ISDATE(セル) や表示形式で、漏れる行の値が本当に日付かを確認してください。
month() で10月を指定したのに9月が出てきます。
QUERY の month() は 0 始まりで、1月が 0、10月が 9 を返します。Google のクエリ言語のリファレンスにも month(date "2009-02-05") が 1 を返すと書かれています。10月で絞るなら where month(A) = 9 と書くか、年月の範囲を date リテラルで指定してください。