AppSheet における日時の扱い
AppSheet における日時は、"YYYY/MM/DD" や "MM/DD/YYYY"、"YYYY年MM月DD日"といったフォーマットに一致する文字列で、年・月・日の情報をもちます。日付型のデータはデフォルトでは "MM/DD/YY" のフォーマットで表示されます。
日時式の基本
日時式として扱うことができる定数の値は、日時として判定される文字列です。日時として判定されるかどうかは特定のフォーマットに一致しているかどうかが鍵となっています。フォーマットについては、こちらの記事を参照してください。
日時式の定数の値は、一致したフォーマットによって、日時 (DateTime) 型、日付 (Date) 型、時間 (Time) 型、期間 (Duration) 型の4種に分類することができます。型によって関数に入力する際の扱いや、画面に表示される際のデフォルトのフォーマットが異なります。表示する際のフォーマットを変更するには TEXT関数を利用します。
日時型は日付型と時刻型を、間にスペースを挟んで連結したもので、文字通り日付と時間両方の情報(年・月・日・時・分・秒)をもちます。日時型のデータはデフォルトでは "YYYY/MM/DD HH:MM:SS" のフォーマットで表示されます。
日付型は "YYYY/MM/DD" や "MM/DD/YYYY"、"YYYY年MM月DD日"といったフォーマットに一致する文字列で、年・月・日の情報をもちます。日付型のデータはデフォルトでは "MM/DD/YY" のフォーマットで表示されます。
時刻型は "HH:MM:SS" や "HH時MM分" といったフォーマットに一致する文字列で、時・分・秒の情報をもちます。時刻型のデータはデフォルトでは "HH:MM:SS" のフォーマットで表示されます。
期間型は "HHH:MM:SS" や "D.HHH:MM:SS" のフォーマットに一致する文字列です。時刻型に似ていますが H の項が3桁になっている点が特徴です。日数の項は省略することができますが、秒数の項は省略できません。
以下に日時式の定数の値の例を示します。表で示すように、年月日時分秒の一部の情報が不足していても、日時式として扱われる場合があります。そういった場合に、不足している情報は AppSheet によって補完されます。また、日付型や時刻型を日時型として扱おうとした場合にも、不足している情報が補完されます。
日時式の定数の値
|
分類
|
フォーマット
|
備考
|
"2023/01/02 03:04:05"
|
日時型
|
"YYYY/MM/DD HH:MM:SS"
|
|
"2023/1/2 3:4:5"
|
日時型
|
"YYYY/M/D H:M:S"
|
月・日・時・分・秒は短縮形でもよい
|
"2023-01-02"
|
日時型
|
"YYYY-MM-DD"
|
|
"2023年1月2日"
|
日付型
|
"YYYY年/M月/D日"
|
日本語でもよい
|
"1/2"
|
日付型
|
"M/D"
|
年が不足していてもよい
|
"1.2"
|
日付型
|
"M.D"
|
小数型との混同に注意
|
"2023/1/2"
|
日付型
|
"YYYY/M"
|
日が不足していてもよい
|
"03:04:05"
|
時刻型
|
"HH:MM:SS"
|
|
"03:04"
|
時刻型
|
"HH:MM"
|
時と分のペアが優先される
|
"3時4分5秒"
|
時刻型
|
"H時M分S秒"
|
日本語でもよい
|
"003:04:05"
|
期間型
|
"HHH:MM:SS"
|
3時間4分5秒の期間を表す
|
"-003:04:05"
|
期間型
|
"-HHH:MM:SS"
|
期間型は負の値をとることができる
|
"2.003:04:05"
|
期間型
|
"D.HHH:MM:SS"
|
2日と3時間4分5秒の期間を表す
|
日時式の加減算
日時式と整数値(Number)を加減算する場合、日時式の型によって結果が異なります。ただし整数値から日時式を引くことはできません。
日時型または日付型と整数値を加減算すると、日(day)の情報が加減されます。カレンダーに存在しない日付が発生しないように、適切に月や年の情報も更新されます。
時刻型・期間型と整数値を加減算すると、時(hour)の情報が加減されます。時刻型では時(hour)の値が 0 から 23 の間の整数値になるように、24の繰り上がり・繰り下がりが発生します。
日時式と整数値の加減算
|
結果
|
備考
|
"2023/01/02 03:04:05" + 10
|
"2023/01/12 03:04:05"
|
日時型では、日(day)が加減される
|
"2023/01/02" + 10
|
"2023/01/12"
|
日付型では、日(day)が加減される
|
"2023/01/02" + 30
|
"2023/02/01"
|
|
"2023/01/02" - 30
|
"2022/12/03"
|
|
"03:04:05" + 10
|
"13:04:05"
|
時刻型では、時(hour)が加減される
|
"03:04:05" + 30
|
"09:04:05"
|
24の繰り上がりが発生
|
"03:04:05" - 10
|
"17:04:05"
|
24の繰り下がりが発生
|
"003:04:05" + 10
|
"013:04:05"
|
期間型では、時(hour)が加減される
|
"003:04:05" - 10
|
"-006:55:55"
|
期間型は負の値をとる
|
10 - "2023/01/02 03:04:05"
|
エラー
|
整数値から日時式を引くことはできない。
|
10 - "003:04:05"
|
エラー
|
整数値から日時式を引くことはできない(期間型)。
|
10 + "-003:04:05"
|
"006:55:55"
|
負の期間型を足すことはできる
|
日時式どうしの加減算には以下の3つの制約があります。
1: 日時型・日付型・時刻型の日時式の組み合わせで足し算は不可
2: 日時型・日付型・時刻型の日時式どうしで引き算をすることができる
このとき結果は期間型になります。日付型 - 時刻型 のように異なる型どうしで計算を行ってもエラーにはなりませんが、そのデータが持っていない情報については AppSheet に設定されているデフォルトの値が自動で利用されるので、注意が必要です。
3: 期間型は全ての日時式と加減算を行うことができます。
日時型・日付型と期間型で加減算を行うと日時型の値を返します。
時刻型と期間型の組み合わせだと時刻型、期間型どうしだと期間型の値を返します。
ただし、期間型から日時型・日付型・時刻型を引くことはできません。
「日時式どうしの計算では必ず期間型が登場する」と覚えておきましょう。
重要なテクニックとして、"00:00:00" という時刻型の値を利用して、時刻型と期間型を自在に変換することができます。
"03:04:05" は時刻型ですが、"03:04:05" - "00:00:00" を計算した結果の "003:04:05" は期間型です。"2023/01/02" + "03:04:05" は日付型と時刻型の足し算なのでエラーになりますが、"2023/01/02" + "003:04:05" は日付型と期間型の足し算なのでエラーにはならず、"2023/01/02 03:04:05" という日時型の値を返します。このように、"00:00:00" を利用した時刻型と期間型の変換を行うことで、擬似的に日付型と時刻型の足し算を行うことができます。
日時式どうしの加減算
|
結果
|
備考
|
"2023/01/02" + "03:04:05"
|
エラー
|
日時型・日付型・時刻型の日時式の組み合わせで足し算はできない
|
"2023/01/02 03:04:05" - "2023/01/02 02:04:05"
|
"001:00:00"
|
日時型・日付型・時刻型の日時式の引き算は期間型を返す
|
"2023/01/02" - "2023/01/01"
|
"024:00:00"
|
|
"03:04:05" - "00:00:00"
|
"003:04:05"
|
"00:00:00" という時刻型を利用することで、時刻型を期間型に変換することができる
|
"2023/01/02 03:04:05" + "001:00:00"
|
"2023/01/02 02:04:05"
|
日時型 ± 期間型 は日時型
|
"2023/01/02" - "024:00:00"
|
"2023/01/01"
|
日付型 ± 期間型 は日付型
|
"03:04:05" + "030:00:00"
|
"09:00:00"
|
時刻型 ± 期間型 は時刻型
|
"2023/01/02" + ("03:04:05" - "00:00:00")
|
"2023/01/02 03:04:05"
|
"00:00:00" という時刻型を利用することで、日付型と時刻型の足し算を擬似的に実行できる
|
日時関数
日時を扱う関数を紹介します。
DATETIME関数、DATE関数、TIME関数
DATETIME関数は、日時型・日付型・時刻型の when を日時型に変換する関数です。同様にDATE関数は日付型、TIME関数は時刻型に変換します。
時刻型から日時型・日付型への変換や、日付型から日時型・時刻型への変換では不足している情報の補完が行われます。時刻型のデータは日付の情報をもっていないため、日時型や日付型に変換される際には "1899/12/30" を利用します。また、日付型のデータは時間の情報をもっていないため、日時型や時刻型に変換される際には "00:00:00" を利用します。これらの値は AppSheet の日時式のデフォルト値として設定されているため、覚えておくと良いです。
関数
|
返り値
|
備考
|
DATETIME("2023/01/02")
|
"2023/01/02 00:00:00"
|
時間のデフォルト値が利用される
|
DATETIME("03:04:05")
|
"1899/12/30 03:04:05"
|
日付のデフォルト値が利用される
|
DATE("2023/01/02 03:04:05")
|
"2023/01/02"
|
|
TIME("2023/01/02 03:04:05")
|
"03:04:05"
|
|
NOW関数、TODAY関数、TIMENOW関数、UTCNOW関数
NOW関数、TODAY関数、TIMENOW関数、UTCNOW関数は、現在の日時(日付・時間)を取得する関数です。
NOW関数は現在の日時を日時型で返します。
TODAY関数は現在の日付を日付型で返します。
TIMENOW関数は現在の時間を時刻型で返します。
NOW関数、TODAY関数、TIMENOW関数が取得する日時(日付・時間)はユーザーの端末のタイムゾーン設定の影響を受けます。タイムゾーンの設定に影響されない日時を取得するにはUTCNOW関数を利用します。
UTCNOW関数は現在の日時をUTC時間(Coordinated Universal Time:協定世界時)で取得し、日時型で返します。日本のタイムゾーンはUTC時間よりも9時間進んでいます。
UTCNOW関数が "2023/01/01 00:00:00" を取得する場合、タイムゾーンが日本に設定された端末上でのNOW関数の結果は "2023/01/01 09:00:00" になります。
YEAR関数、MONTH関数、DAY関数
これらの関数は、日時型・日付型・時刻型の when を入力にとり、年・月・日を整数型で返します。when が日時型・日付型・時刻型の日時式でない場合には 0 を返します。また、when が日付の情報を持っていない時は、AppSheet のデフォルト値である "1899/12/31" が利用されます。
YEAR関数は年 (year) を表す4桁の整数を返します。
MONTH関数は月 (month) を表す 1 から 12 の整数を返します。
DAY関数は日 (day) を表す 1 から 31 の整数を返します。
HOUR関数、MINUTE関数、SECOND関数
これらの関数は、期間型の duration を入力にとり、時・分・秒を整数型で返します。 duration が期間型でない場合には 0 を返します。入力が期間型であることに注意が必要です。日時型や時刻型から時・分・秒を取得したい場合には、(日時型の場合は TIME 関数で時刻型に変換してから) "00:00:00" との引き算をすることで期間型に変換してから関数に入力する必要があります。
HOUR 関数は時 (hour) を表す 0 から 59 の整数を返します。MINUTE 関数は分 (minute) を表す 0 から 59 の整数を返します。SECOND 関数は秒 (second) を表す 0 から 59 の整数を返します。
YEAR 関数などの利用例
関数
|
結果
|
備考
|
YEAR("2023/01/02 03:04:05")
|
2023
|
|
YEAR("03:04:05")
|
1899
|
日付のデフォルト値("1899/12/31")が利用される
|
YEAR("こんにちは")
|
0
|
|
MONTH("2023/01/02 03:04:05")
|
1
|
|
MONTH("03:04:05")
|
12
|
日付のデフォルト値("1899/12/31")が利用される
|
DAY("2023/01/02 03:04:05")
|
2
|
|
DAY("03:04:05")
|
31
|
日付のデフォルト値("1899/12/31")が利用される
|
HOUR("003:04:05")
|
3
|
|
MINUTE("003:04:05")
|
4
|
|
SECOND("003:04:05")
|
5
|
|
HOUR("2023/01/02 03:04:05")
|
エラー
|
HOUR関数の入力は期間型でなければならない
|
HOUR( TIME("2023/01/02 03:04:05") - "00:00:00")
|
3
|
日時型から時・分・秒を取得する場合は期間型に 変換してから関数に入力する
|
TOTALHOURS関数、TOTALMINUTES関数、TOTALSECONDS関数
これらの関数は、期間型の duration が何時間・何分間・何秒間に相当するかを小数型で返します。たとえば "000:15:00" は 15 分間を表す期間型ですが、何時間かで数えると 1 時間の 4 分の 1、つまり 0.25 時間です。期間型をもとに単位を統一することができるため、合計稼働時間の計測などに便利です。HOUR 関数、MINUTE 関数、SECOND 関数とは異なり TOTALHOURS と複数形であることにも注意しましょう。
TOTALHOURS 関数などの利用例
関数
|
結果
|
備考
|
TOTALHOURS("000:15:00")
|
0.25
|
|
TOTALHOURS("001:15:30")
|
1.25833
|
1 * 1 + (1/60) * 15 + (1/3600) * 30
|
TOTALMINUTES("001:15:30")
|
75.5
|
60 * 1 + 1 * 15 + (1/60) * 30
|
TOTALSECONDS("001:15:30")
|
4530
|
3600 * 1 + 60 * 15 + 30
|
EOWEEK関数、EOMONTH関数、EWOMONTH関数
EOWEEK関数は、日時型または日付型の when を入力にとり、when の週の最終日(土曜日)を日付型で返します。関数名は end of week(週末)の省略形でしょう。
EOMONTH関数は、日時型または日付型の when と 整数型の offset-month を入力にとり、when から offset-month ヶ月後の月の最終日を日付型で返します。関数名は end of month(月末)の省略形でしょう。
EWOMONTH関数は、日時型または日付型の when と 整数型の offset-month を入力にとり、when から offset-month ヶ月後の月の最後の平日を日付型で返します。ここでの平日とは月曜日から金曜日のことであり、祝日は考慮されません。関数名は end weekday of month(月の最後の平日)の省略形でしょう。
WORKDAY関数
WORKDAY関数は、日付型の when と整数型の days を入力にとり、when から days 営業日後の日付を返します。ここでの営業日とは月曜日から金曜日のことで祝日は考慮されません。オプションとして日付型のリスト holidays を入力することで、リストに含まれる日付は営業日から除外します。
関数
|
結果
|
WORKDAY("2019/12/01", 25, LIST("2019/12/24", "2019/12/25", "2020/01/01"))
|
"2020/01/08"
|
WEEKDAY関数、WEEKNUM関数、ISOWEEKNUM関数
WEEKDAY関数は、日時型または日付型の when の曜日を 1 から 7 の整数値に変換して返します。曜日と整数の対応は、1が日曜日で順に割り当てられ、7が土曜日です。
WEEKNUM関数は、日時型または日付型の when がその年の第何週にあたるかを 1 から 53 の整数値で返します。1月1日が含まれる週が第1週で、12月31日が含まれる週が第53週です。AppSheet では週は日曜日に開始するものとして扱われます。
ISOWEEKNUM関数は、WEEKNUM関数同様に、日時型または日付型の when がその年の第何週にあたるかを 1 から 53 の整数値で返します。ただしISOWEEKNUM関数はISO週番号を取得します。ISO週番号とは国際標準化機構(ISO:International Organization for Standardization )が定めた、日付と時刻の表記に関する規格「ISO 8601」で規定されているカレンダーの週番号のことです。ISO週番号では必ずしも1月1日が第1週になるとは限りません。
まとめ
本記事では AppSheet で取り扱う日時型について解説しました。
初学者の方・アプリ開発をより発展的に使っていきたい方は参考にしてみてください。
その他の AppSheet 関数に関する詳しい記述は、弊社出版中の書籍付録でもご確認いただけますのでぜひ併せてご覧ください。
ノーコードツール Google AppSheet 標準アプリ開発入門
AppSheet に関する実績やサービス詳細、価格表等についてもっと詳しく知りたい場合は、資料もご用意しておりますのでお問い合わせください。