見出し画像

Googleスプレッドシート QUERY関数 超応用例 12(続 日付、日時、時刻を扱う)

Googleスプレッドシートの最強集計関数 QUERY関数について書いたnoteの第12回です。

👇これまでのQUERY関数シリーズは マガジンにまとめています。QUERY関数をハイレベル(廃レベル)に使いこなしたい人は必読です!


前回はQUERY関数の 日付・日時・時刻のリテラル比較演算子と組み合わせた使い方について書きました。

今回は 

  1. 日付・日時・時刻のリテラル 記述ルールを理解する

  2. 日付・日時・時刻で比較演算子が使えることを理解する

  3. 日付・日時・時刻を加工できるスカラー関数を理解する 👈今回理解

  4. 日付・日時・時刻で文字列比較演算子を使う方法を理解する

スカラー関数を取り上げていきます。




3. 日付・日時・時刻を加工できるスカラー関数を理解する

QUERY関数の日付・日時・時刻をマスターする為のポイントその3 が、スカラー関数です。

$$
\begin{array}{lll}
\text{No}&\text{スカラー関数}&\text{解説}\\ \hline
\text{1}&\text{year()}&\text{日付または日時の値から年を数値で返す}\\ \hline
\text{2}&\text{month()}&\text{日付または日時の値から月を数値で返す
※月の値は0スタート}\\ \hline
\text{3}&\text{day()}&\text{日付または日時の値から日を数値で返す}\\ \hline
\text{4}&\text{hour()}&\text{日時または 時刻から時間の値を数値で返す}\\ \hline
\text{5}&\text{minute()}&\text{日時または 時刻から分の値を数値で返す}\\ \hline
\text{6}&\text{second()}&\text{日時または 時刻から秒の値を数値で返す}\\ \hline
\text{7}&\text{millisecond()}&\text{日時または 時刻からミリ秒の値を数値で返す}\\ \hline
\text{8}&\text{quarter()}&\text{日付または日時の値から四半期を数値で返す}\\ \hline
\text{9}&\text{dayOfWeek()}&\text{日付または日時の値から曜日を数値で返す
※日曜日から1始まり}\\ \hline
\text{10}&\text{now()}&\text{現在の日時をかえす
※GMT タイムゾーン}\\ \hline
\text{11}&\text{dateDiff()}&\text{2 つの 日付、または日時の間の日数を数値で返す。}\\ \hline
\text{12}&\text{toDate()}&\text{指定された値を date 値(日付型)に変換する。
※日時や数値(エポック値)を日付に出来る}\\ \hline
\end{array}
$$

https://developers.google.com/chart/interactive/docs/querylanguage?hl=ja#scalar_functions

select、where、group by、pivot、order by、label,、 format のいずれかの句で使用できる スカラー関数は15個ありますが、そのうち upperlower 以外の 12個のスカラー関数 が 日付、日時、時刻 型に関連するものです。

それぞれの挙動や使い方を、select句、where句での活用例やお題形式で学んでいきましょう。



3-1~3-3. 日付から 年、月、日を 取り出す year(), month(), day()

QUERY関数のクエリ文で、日付や日時型のデータから 年、月、日を 数値として取得するスカラー関数が

年を取得する ・・・ year()
月を取得する ・・・ month()
日を取得する ・・・ day()

これらになります。

この3つは他のスカラー関数に比べて圧倒的に知名度、使用頻度が高いので、使ったことがある人も多いんじゃないでしょうか。



スカラー関数 year(), month(), day() の使い方

シート関数と同じ名前、(ほぼ)同じ機能の関数なんでわかりやすいですね。(月がズレてますが、これは後ほど解説します)

=QUERY(A1:D8,"select year(Col1),month(Col1),day(Col1) where Col4 ='A'")

こんな式で、4列目が Aと一致するという条件でデータを絞り込んだ上で、1列目の日付から 年、月、日をそれぞれ数値として出力することが出来ます。

year(),month(),day() は日付型の列に対してだけでなく

日時型の列や

時刻型の列 に対しても利用できます。

使用はできますが、基本的に時刻型の列から 年、月、日を取得することはありません。

存在しない時刻の日付部分は、シリアル値 0 の日付 1899/12/30 として扱われます。(月のズレは後述します)



【注意】QUERY関数の スカラー関数 month() は 0はじまりでひと月ズレる

年、月、日を取得するスカラー関数、year(), month(), day() は、シート関数と同じように使えると書きましたが、 month() だけは 注意が必要です。

公式にも

month()
日付または日時の値から、ゼロベースの月の値を返します。注: 月は 0 から始まるので、1 月の場合は 0、2 月の場合は 1 が返されます。

https://developers.google.com/chart/interactive/docs/querylanguage?hl=ja#scalar-functions

このように記載がある通り、QUERY関数のクエリ文で使う month() は0スタートです。

1月を 0として、2月を1、3月を2 ・・・12月を11と、一つ前の数字を返します。

これはGASで日付を扱ったことがある人は、getMonth()メソッド の仕様と一緒なんで慣れているかもしれませんが、

プログラミングやらない人だと、かなり違和感があるかもしれません。

とりあえず仕様なんで慣れていきましょう。


というわけで スカラー関数 month() を使って日付データから月を取得して扱う場合は

=QUERY(A1:D8,"select year(Col1),month(Col1)+1,day(Col1) where Col4 ='A'")

month(Col1)+1

👆このようにします。

month() の結果は数値なので、ここは +演算子が普通に使えますね。

「QUERY関数で month()を使う際は、 +1 する」と覚えちゃいましょう!



Q1. セルで年、月を指定してQUERY関数でデータを抽出したい

それでは お題いってみましょう。

A1:D8 のデータを対象として G1セルの年、G2セルの月の数値に1列目の日付データの年、月が一致するデータをQUERY関数で抽出したい場合、どのような式を組めばよいでしょうか?

サンプルデータは以下を利用ください。

日付	日時	時刻	テキスト
2025/07/01	2025/07/01 10:45	10:45	A
2025/07/02	2025/07/02 11:30	11:30	B
2025/12/12	2025/12/12 14:22	14:22	A
2026/01/22	2026/01/22 16:01	16:01	A
2025/07/05	2025/07/05 17:11	17:11	B
2025/07/06	2025/07/06 18:50	18:50	B
2026/02/20	2026/02/20 21:40	21:40	A

考えてみましょう!

簡単すぎるという人は、スカラー関数を使わず前回までの学習範囲(リテラル + 比較演算子)で 式を作る別解にもチャレンジしてみましょう。








↓↓
回答はここから。

↓↓




A1. セルで年、月を指定してQUERY関数でデータを抽出する

回答です。

=QUERY(A1:D8,
"where year(Col1) ="&G1&" and month(Col1)+1 = "&G2)

列1(Col1)から 年、月をそれぞれ スカラー関数で取り出し、それを G1、G2の年、月の数値と 一致しているか? を = で判定します。

ポイントは先ほども触れた

「QUERY関数で month()を使う際は、 +1 する」

ですね。

month(Col1)+1 = "&G2

このように記述することで、スカラー関数の month() が 0始まりで 1ヶ月のズレがあるのを調整しています。

なお、G1、G2は 数値なので シングルクォートは不要です。

簡単でしたかね?



A1.【別解】スカラー関数を使わず セルで年、月を指定してQUERY関数でデータを抽出する

スカラー関数を使わず式を作る別解ですが、幾つかアプローチがあります。

=QUERY(A1:D8,
"where Col1 >= date '"&G1&"-"&G2&"-1' and
Col1 < date '"&G1+(G2=12)&"-"&(G2+1)^(G2<12)&"-1'")

たとえば、割と短いのが 👆こんな式。(一例です)

中身は少し複雑ですが、前回のお題7でやった期間内のデータを抽出する式の応用ですね。

QUERY関数11 Q7. セルで指定した2つの日付の期間内のデータを抽出したい


式の中でG1とG2の年、月を参照して 👇このようなクエリ文を生成しています。

where Col1 >= date '2025-7-1' and Col1 < date '2025-8-1'

7月を取得するから、7月の月末は31日で・・・と、月末の日付を求めてもいいんですが、

ここは 翌月の1日 より小さい(1日は含まない)

Col1 < date '2025-8-1'

とすることで、 G2+1 と月をずらすだけで2025年7月のデータだけが取得できます。

ただし、G2セルの月が 12だった時は 年を+1して、月を1にする必要があるので、その部分を

date '"&G1+(G2=12)&"-"&(G2+1)^(G2<12)&"-1'"

この2ヵ所で調整しています。

演算子と組み合わせた際に TRUEは1、FALSEは0と扱われることと、
数値の 0乗 は 数値がなんであっても 1を返すという特性を利用した式です。

スプレッドシートでは 0^0も1を返す

ただ、少しわかりにくいですよね。

式は長くなりますが一度DATE関数で日付化してからTEXT関数で文字列化する以下の式の方が読みやすいかもしれません。

=QUERY(A1:D8,
"where Col1 >= date "&TEXT(DATE(G1,G2,1),"'yyyy-MM-dd'")&
" and Col1 < date "&TEXT(DATE(G1,G2+1,1),"'yyyy-MM-dd'"))

別解その2

もしくは 月末の日付を求めて 以下 <= とする方法もあります。

=QUERY(A1:D8,"where Col1 >= date '"&G1&"-"&G2&"-1' and
Col1 <= date '"&G1&"-"&G2&"-"&DAY(DATE(G1,G2+1,0))&"'")

別解3

別解3は、DATE関数 が DATE(年, 月, 日) の 日を 0とすると 前月の月末の日にちを返す特性を利用しています。

月が13となった場合は次の年の1月の日付となる


別解を3つ紹介しましたが、別解よりも QUERY関数で 年、月で絞り込む場合は スカラー関数の year(), month()を使った方が圧倒的に簡単とうことが、おわかりいただけたんじゃないでしょうか。

実は年・月を条件とする抽出は、この後登場する 文字列比較演算子を使うとさらに簡潔だったりします。こちらは次週紹介!

とりあえず QUERY関数のwhere句で年、月を条件とする 抽出は、スカラー関数を使う方法が基本です。

しっかり理解しておきましょう。



3-4~3-7. 日時、時刻から 時、分、秒、ミリ秒 を取り出す hour(), minute(), second(), millisecond()

QUERY関数のクエリ文で、日時や時刻型のデータから 時、分、秒、さらにミリ秒を 数値として取得するスカラー関数が

時を取得する ・・・ hour()
分を取得する ・・・ minute()
秒を取得する ・・・ second()
ミリ秒を取得する ・・・ millisecond()

これらになります。



スカラー関数 hour(), minute(), second(), millisecond() の使い方

=QUERY(A1:D8,"select hour(Col2),minute(Col2),second(Col2) where Col4 ='A'")

先ほどと同じ要領で、👆こんな式で 4列目が Aに一致するという条件で絞り込んだ上で、2列目(日時型)から時、分、秒を 数値としてそれぞれ取得した結果を返すことが出来ます。

日時型だけでなく、時刻型の列を対象とすることも可能です。

ただし、

日付型の列に利用することは出来ません

先ほどの year(), month(), day() は 時刻型の列にも使えましたが、こっちはダメなんですね。

ちなみに 24時間以上を表示した、表示形式を「経過時間」( [h]:mm:ss) とした列を対象とした場合でも、

スカラー関数の hour() は 23 以上を返すことは出来ません。

 24時は 0となり、それ以上は 日時表示した時刻部分から 時、分、秒を取得するイメージです。

また、あまり使わないかもしれませんが ミリ秒だけを取得する スカラー関数

ミリ秒を取得する ・・・ millisecond()

もあります。

あまり活用シーンは無いんで、こちらはお題は無しで。



3-8. 日付、日時から 四半期を 取得する quarter()

QUERY関数のクエリ文で、日付、日時型のデータから 四半期を 数値として取得するスカラー関数が

四半期を取得する ・・・ quarter()

です。


スカラー関数 quarter() の使い方

=QUERY(A1:D8,"select Col1,quarter(Col1)")

1年を3か月ずつ 4つに分けて、

1月~3月 を 1
4月~6月を 2
7月~9月を 3
10月~12月を 4

とした数値を返します。四半期ごとの実績集計で使えます。



Q2. 指定した年の上期データを取得したい

簡単なお題で練習してみましょう。QUERY関数の quarter()関数を使って、左のA1:D8のデータから 2025年の上期(1~6月)のデータを抽出したい場合、どのような式を組めばよいでしょうか?

データはお題1と同じです。考えてみましょう!










↓↓
回答はここから。

↓↓




A2. 指定した年の上期データを取得する

回答です。

=QUERY(A1:D8,"where year(Col1) = 2025 and quarter(Col1) < 3")

上期(1~6月)は第1四半期~第2四半期の6か月なので、

quarter(Col1) < 3

を 年の条件 に and で加えればよいですね。

もちろん month()を使って

=QUERY(A1:D8,"where year(Col1) = 2025 and month(Col1) < 6")

でも同じ結果になります。

quater()は where句というよりは、今後登場する group by や pivot 句を使った集計 で活用するケースが多いです。



3-9. 日付、日時から 曜日を 取得する dayOfWeek()

QUERY関数のクエリ文で、日付、日時型のデータから 曜日を 数値として取得するスカラー関数が

曜日を数値で取得する ・・・ dayOfWeek()

です。



スカラー関数 dayOfWeek() の使い方

=QUERY(A1:D8,"select Col1,dayofweek(Col1)")

日曜日を1として、

日 1
月 2
火 3
水 4
木 5
金 6
土 7

このように曜日を数値で返します。シート関数の WEEKDAY関数と同じ感覚で使えますね。

公式は dayOfWeek()キャメルケースで記述されていますが、クエリ内で大文字小文字を気にする必要はないので dayofweek() でも、 DAYOFWEEK()でも 問題ありません。

こちらは もう少し先の回で登場する format句 と合わせて活用することが多いです。



Q3. 出来るだけ短い式で 土日のデータだけを抽出したい

では、ちょい応用のお題にチャレンジしてみましょう。

左のデータ(👇データはこちらを利用ください)

日付	日時	時刻	テキスト
2025年7月1日(火)	2025/07/01 10:45	10:45	A
2025年7月2日(水)	2025/07/02 11:30	11:30	B
2025年7月3日(木)	2025/07/03 14:22	14:22	A
2025年7月4日(金)	2025/07/04 16:01	16:01	A
2025年7月5日(土)	2025/07/05 17:11	17:11	B
2025年7月6日(日)	2025/07/06 18:50	18:50	B
2025年7月7日(月)	2025/07/07 21:40	21:40	A

から、1列目が 土日 のデータのみをQUERY関数で抽出したい場合、どのような式を作ればよいでしょうか?

ただし、出来る限り短い式を作るものとします。

考えてみましょう!










↓↓
回答はここから。

↓↓




A3. 出来るだけ短い式で 土日のデータだけを抽出する

回答です。

=QUERY(A1:D8,"where dayofweek(A)%7 < 2 " )

どうでしょう?ここまで短く出来たでしょうか?

解説していきます。

まず 通常は dayofweek(Col1) と 列を Colで指定する記述を推奨していますが、今回は「出来る限り短い式でとする」という縛りがあるので、列のアルファベット指定を使っています。

そして スカラー関数の dayOfWeek() は日曜始まりなので 日曜日が1、土曜日が7となります。

残念ながら シート関数の WEEKDAY関数 の第2引数のような 日曜始まりを月曜始まりに変えるようなオプションはありません。

スカラー関数の dayOfWeek() の 曜日に対応する数値は固定です。

だから普通に式を書くと

=QUERY(A1:D8,"where dayofweek(A)=1 or dayofweek(A)=7 " )

このように dayofweek(A) が 1または7と一致するという条件を記述した式になります。

ただこれだと orで 同じような記述2つをつなぐことになるんで、どうしても長くなってしまいます。

ここで使えるのが 公式には乗っていない 隠れ算術演算子の %(modulo)です。

QUERY関数3 算術演算子(実は % 剰余も使える)

曜日の1~7(日~土)という数値に対して、7で割った余りを求めると日曜日は1のままですが、

7だった土曜日は7で割ると余りが無いので 0になります。

つまり 

土曜日または日曜日
 ▼
dayOfWeek(A) が 1または7
 ▼
dayOfWeek(A)を7で割った余りが 2より小さい

と条件を言い換えることが可能で、

dayOfWeek()を7で割った余りが 2より小さい

は、

dayofweek(A)%7 < 2

とクエリ内で記述できます!

このように QUERY関数で 曜日を数値で取得するスカラー関数 dayofweek() は、 format句と 算術演算子 %(modulo)と組み合わせて活用することが多いです。

是非、覚えておきましょう。




3-10. 現在の日時を出力する now() ※ただし GMT タイムゾーン

QUERY関数のクエリ文でも、実は now()関数が使えます。

現在の日時を返す スカラー関数も そのまんま

現在の日時を返す ・・・ now()

です。



スカラー関数 now() の使い方

=QUERY(,"select now()")

見出しは付きますが、now()関数と同じように日時を返せます。

シート関数のNOWと同じくシート更新時、また 設定すれば毎分更新される揮発性関数です。

重い処理をするQUERY関数で使うには注意が必要です。

でも、それ以前に・・・スカラー関数の now()が返す現在時刻は、

GMTタイムゾーンの現在時刻なんです!

👆を見ていただくとわかりますが、シート関数のNOW()が返す日本時間(JST)と比べ、ちょうど9時間遅いのがわかりますね。

便利に使えそうではあるんですが 9時間の時差を考えると、日本時間の環境ではなかなか使いどころが難しいかなと。

シート関数であれば +"9:00" で サクッと9時間後に調整できるんですが、クエリ文の中でこれを日本時間にすることは恐らく出来ません。

ちなみに、TODAY関数に該当するスカラー関数もありません。

日本の時間設定で 現在の日時、今日の日付をQUERY関数で利用したい場合は、シート関数の NOW()、TODAY()を組み合わせることをお勧めします。



3-11. 2つの日付の差分が何日あるか?を返す dateDiff()

QUERY関数のクエリ文内では、日付どうしの 減算(引き算)が出来ません。
そこで活躍するのが、2つの日付の差分を日数の数値で返す

2つの日付の差分を返す ・・・ dateDiff()

です。

シート関数のDATEDIFに似てますが、スカラー関数の方はfが2つなんで注意。



スカラー関数 dateDiff() の使い方

スカラー関数の dateDiffはシート関数の DATEDIFと違って、第3引数の単位が指定できないので、差分は日数でしか返せません。

さらに

DATEDIF(開始日, 終了日, 単位)

シート関数のDATEDIF

に対して、スカラー関数の dateDiff()は、

dateDiff(終了日, 開始日)

QUERY関数クエリ文のスカラー関数 dateDiff

このように第3引数が無いだけでなく、スカラー関数のdateDiff()は 開始日、終了日が DATEDIF関数と逆にるのです。

つまり開始日が1列目、終了日が2列目だった場合は

=QUERY(A1:C8,"select datediff(Col2,Col1)")

このように使うってことです。

また、DATEDIF関数は 開始日が終了日より大きい場合は#NUM!エラーを返しますが、

スカラー関数の dateDiff() は、マイナスの日数を返すことができます。エラーにならないのはよいですね。

一応dateDiffは 日付型だけでなく、日時型でも 利用できますが、

公式にも 値の date 部分(日付部分)のみが計算に使用され、時間の値は比較の前に切り捨てられる、と記載がある通り

2025/06/30 0:01 と 2025/06/30 22:59 の差は 時間を考慮するとほぼ 1日ですが、

dateDiff()では時間を切り捨てた 2025/06/30 と 2025/06/30 の比較となる為、0が返ります。

QUERY関数で日付を扱う際に重要となるスカラー関数なんですが、QUERY関数の dateDiff()をきちんと解説しているサイトをほぼ見かけません。



Q4. 期限が残り3日を切った「完了」していないタスクをQUERY関数で抽出したい

それでは dateDiff()を活用するお題にチャレンジしてみましょう。

左のようなテーブルがあった場合、ステータス(列4)が「完了」になっていない、期限まで残り3日を切ったデータだけをQUERY関数で抽出したい場合、どのような式を組めばよいでしょうか?

「期限まで残り3日を切った」は、今日の日付と比較した差分が 3より小さいとします。

つまり、 本日が 2025/07/12だった場合、 期限 2025/07/15 のデータは 差分が3日なので ギリ対象外、期限 2025/07/14 のデータは差分が 2日なので 抽出対象ってことです。

データは以下をA1に貼り付けて 「当番表」という名前のテーブルにしてご利用ください。(お題にチャレンジする日付に合わせて期限の日付を修正ください)

担当	ToDo	期限	ステータス
山田	書類の提出	2025/07/14	着手
田中	電話する	2025/07/12	完了
佐藤	録画する	2025/07/11	未着手
山田	定期を買う	2025/07/18	完了
鈴木	まぜる	2025/07/16	着手
田中	フィルター掃除	2025/07/15	着手
鈴木	裏返す	2025/07/10	未着手
山田	感じる	2025/07/14	着手

考えてみましょう!











↓↓
回答はここから。

↓↓




A4. 期限が残り3日を切った「完了」していないタスクをQUERY関数で抽出する

回答です。

=QUERY(当番表[#ALL],"where Col4 != '完了' and
dateDiff(Col3,date "&TEXT(TODAY(),"'yyyy-MM-dd'")&") < 3 ")

解説していきます。

まず、列4が「完了」となっているデータは除外するので、1つ目の条件は

" where Col4 != '完了' "

となります。 これに加えて and で 本日の日付との差分が 3より小さい <3 としたいので、ここで dateDiff が登場します。

" where Col4 != '完了' and dateDiff(Col3, 【ここに本日の日付】   )  <3 "

本日の日付は シート関数の TODAY()を使います。

ただ、これまで学んできたように シート上の日付や日時は クエリ文内ではそのまま使えません。

日付リテラルとして機能するようにTEXT関数を組み合わせて

date 'yyyy-MM-dd'

という形に 成形する必要があります。

"where Col4 != '完了' and
dateDiff(Col3,date "&TEXT(TODAY(),"'yyyy-MM-dd'")&") < 3 "


出来ましたでしょうか?


このお題ですが、実は そこまで 厳密でなくてもOKなら 先ほど登場したスカラー関数の now()を使って

=QUERY(当番表[#ALL],"where Col4 != '完了' and dateDiff(Col3,now()) < 3 ")

このようにシンプルに書けます。

スカラー関数の now() であればリテラルを気にせずそのまま 日時として利用できて、さらに dateDiff の中で now() の時刻以下は切り落とされて日付 のみが採用され差分を返すので、

dateDiff(Col3,now()) < 3

と、now() がそのまま使えるのが良いですね。

ただし、これは9時間の時差が考慮されていないので、日本時間が朝の9時~夜 日付が変わる24時前までは正しい結果が返りますが、日本時間が 夜の0時~朝9時までの間は日付のズレが発生します。


👆上の例だと 日本時間が 2025/07/12 08:40:00 の時、クエリ内のnow()関数は9時間前の 2025/07/11 23:40:00 を返していますね。

日本の日付より 1日前の日付を元に dateDiff()が 差分を計算する為、正しい結果となりません。

上と下で回答にズレ(2025/07/14 期限のデータが漏れている)が発生しています。

これが スカラー関数の now()が使いどころが難しい点です。

とりあえず dateDiff() は便利そうですね!



3-12. 日時や数値を 日付に変換する toDate()

最後12番目のスカラー関数は、 日時や数値から 日付型に 型変換ができる

日時や数値を date 値に変換 ・・・ toDate()

です。

シート関数の TO_DATE関数に少し似てる関数です。



スカラー関数 toDate()の使い方

スカラー関数 toDate()の 役割は大きく2つあります。

  1. 日時データを日付に変換する

  2. 数値(エポックミリ秒)を日付に変換する

クエリ内で 日時や数値を 日付という別の型に変換できる希少な関数と言えます。


先に 1つ目の 日時 → 日付 の型変換 から見ていきましょう。

たとえば

=QUERY(A1:C8,"select toDate(Col1),toDate(Col2),Col3")

このように 日時型の 列1、列2に対してselect句で利用し 時間部分を切り捨てて 日付型に変換したり、where句で 日時型のデータを日付として条件利用する際に活用できます。



Q5. 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	鎌田さん

考えてみましょう!

※ toDate()を使う式がさくっと作れちゃった人は、他のスカラー関数を使う式も考えてみましょう! 







↓↓
回答はここから。

↓↓







A5. Googleフォームの回答データから QUERY関数(のスカラー関数)でタイムスタンプの日付を条件として抽出する

回答です。

=QUERY(アンケート回答[#ALL],
"where toDate(Col1) = date "&TEXT(D1,"'yyyy-MM-dd'"))

まさに toDate()を使うべき場面ですね!

スカラー関数を使わず 比較演算子で記述した時は

=QUERY(アンケート回答[#ALL],
"where Col1 >= date "&TEXT(D1,"'yyyy-MM-dd'")&
" and Col1 < date "&TEXT(D1+1,"'yyyy-MM-dd'"))

このように非常に手間でしたが、toDate()を使うことで だいぶすっきり書けました。

ちなみに別解としては、日時を日付として扱って差分を取得する dateDiff()を使って 差分 0 で 日付の一致を見つける式や

=QUERY(アンケート回答[#ALL],
"where dateDiff( Col1,date "&TEXT(D1,"'yyyy-MM-dd'")&") = 0")

別解1

年、月、日をそれぞれ一致判定する、year(), month()+1, day() を使った

=QUERY(アンケート回答[#ALL],"where year(Col1) = "&YEAR(D1)&" and month(Col1)+1 = "&MONTH(D1)&" and day(Col1) = "&DAY(D1))

別解2

こんな式が考えられます。


別解はお遊び回答ですが、QUERY関数で 日時 → 日付 変換できる toDate()は、Googleフォーム のタイムスタンプを扱う時に 便利

これは 覚えておきましょう!



エポックミリ秒(UNIX時間)ってなんだ?

toDate() のもう一つの役割が、数値を UNIX時間(エポックミリ秒)基準で日付に変換する処理です。

公式に

「エポックは、1970 年 1 月 1 日 00:00:00 GMT と定義されます」

とある通り、 1970-01-01 00:00:00.0000として、そこから 1ミリ秒(1/1000秒)を 1として カウントした数値が エポックミリ秒です。

これを 日付型に変換するの関数が toDate()となります。

つまり toDate(0) は 19700/01/01を返し、そこから 24時間後をミリ秒換算した

24 * 60 * 60 *1000 

の一つ手前 24*60*60*1000-1日時 1970-01-01 23:59:59:999 なので、0からそこまでは toDate では時刻部分を切り捨てるので 19700/01/01 となります。

 toDate( 24 * 60 * 60 *1000 ) でようやく 19700/01/02 となるわけです。

桁は大きいですが、シリアル値の考え方と似てますね。


この挙動はシート関数の EPOCHTODATE関数に近いものです。

馴染みが無い人も多いでしょうが、EPOCHTODATE関数はエポック秒(エポックミリ秒)を日時(UTCベース)に変換する関数です。

Googleスプレッドシートに 2023年2月に追加された 比較的新しい関数なんですが、同時に追加された LETVSTACK、TOCOL、CHOOSEROWS、WRAPROWSなどの配列操作系関数が強力すぎて影が薄かった関数。

ミリ秒なので、EPOCHTODATEの第2引数を2に指定することで、こちらは日付ではなく 日時を返しますが、同じように変換が出来ます。

ちなみに EPOCHTODATE関数はマイナスの値をとれませんが、スカラー関数のtoDate()は、マイナスのエポックミリ秒を 日付に変換できます。

つまり 1970年1月1日 以前の日付も扱えるということです。



QUERY関数で日付を加工する時に使える エポックミリ秒

「エポックミリ秒なんて使わないし覚えなくていいでしょ。」

と思う人が多いかもしれませんが、日付や日時をエポックミリ秒(数値)に変換できれば、シリアル値と同じように 算術演算子で加算、減算できるようになります。

そして、その結果のエポックミリ秒の数値を 再び toDate()で 日付に戻すことが出来るってことです。

これが出来れば、QUERY関数で 指定した列の日付の〇日後の日付を出力したり、スカラー関数の now()を時差を考慮した 日本時間の日付に変換することも可能となります!

しかし、toDate()の逆 日付や日時をエポックミリ秒に変換できる関数は残念ながら用意されていません

「じゃあ、どうするか?」

残念ながら今回はかなり長くなってしまったので、この続きの超応用例は次回チャレンジしていきましょう。

※手間がかかるので実用的とは言えませんが



次回、スカラー関数の超応用例と文字列比較演算子で日付・日時・時刻を扱う

今回は  日付、日時、時刻を加工する 12個のスカラー関数を学びました。

次回、QUERY関数の日付・日時・時刻 シリーズのラスト!

エポックミリ秒変換を使った スカラー関数による日付加工の超応用例文字列比較演算子で 日付、日時、時刻を扱う方法を解説します。






いいなと思ったら応援しよう!

mir チップ大歓迎です。やる気がアップしますw