BigQuery、Snowflake、Treasure Data、Athena、MySQL、Oracleの日付時刻編について、構文の違いや注意点をまとめました。
📋 関数一覧
- 現在時刻取得
- 現在日付取得
- 現在UNIXTIME取得
- 日付加算
- 日付差分
- 月間差分
- 年間差分
- 年抽出
- 月抽出
- 日抽出
- 曜日取得
- 日付フォーマット
- 文字列から日付
- 月末取得
- 四半期末取得
- 年末取得
- 年内日数取得
- 週の切り詰め
- 月の切り詰め
- 四半期の切り詰め
- 年の切り詰め
- 週番号取得
- ISO週番号取得
- UNIXTIMEから日付
- UNIXTIMEから文字列
- 文字列からUNIXTIME
- UNIXTIME差分計算
- ミリ秒UNIXTIME取得
- マイクロ秒UNIXTIME取得
現在時刻取得
BigQuery (TIMESTAMP)
CURRENT_TIMESTAMP()
Snowflake (TIMESTAMP_LTZ)
CURRENT_TIMESTAMP()
Treasure Data (TIMESTAMP WITH TIME ZONE)
CURRENT_TIMESTAMP
Athena (TIMESTAMP WITH TIME ZONE)
CURRENT_TIMESTAMP
MySQL (DATETIME)
NOW()
Oracle (DATE)
SYSDATE
Tips
- BigQuery: UTC固定
- Snowflake: セッションTZ依存
- MySQL: CURRENT_TIMESTAMP()も使用可能
- Oracle: 関数形式
現在日付取得
BigQuery (DATE)
CURRENT_DATE()
Snowflake (DATE)
CURRENT_DATE()
Treasure Data (DATE)
CURRENT_DATE
Athena (DATE)
CURRENT_DATE
MySQL (DATE)
CURDATE()
Oracle (DATE)
TRUNC(SYSDATE)
Tips
- BigQuery: UTC基準の日付
- Snowflake: セッションTZ依存
- MySQL: CURRENT_DATE()も使用可能
- Oracle: 時刻部分を切り捨て
現在UNIXTIME取得
BigQuery (INT64)
UNIX_SECONDS(CURRENT_TIMESTAMP())
Snowflake (NUMBER)
EXTRACT(EPOCH FROM CURRENT_TIMESTAMP())
Treasure Data (DOUBLE)
TO_UNIXTIME(CURRENT_TIMESTAMP)
Athena (DOUBLE)
TO_UNIXTIME(CURRENT_TIMESTAMP)
MySQL (INT)
UNIX_TIMESTAMP()
Oracle (NUMBER)
ROUND((SYSDATE - DATE '1970-01-01') * 86400)
Tips
- BigQuery: 秒精度、タイムゾーン考慮
- Snowflake: 秒精度、小数点以下あり
- Treasure Data: 秒精度、小数点以下あり
- Athena: 秒精度、小数点以下あり
- MySQL: 秒精度、整数のみ
- Oracle: SYSDATEベース。EXTRACT(EPOCH...)は未対応
日付加算
BigQuery (DATE)
DATE_ADD(date, INTERVAL n DAY)
Snowflake (DATE)
DATEADD(DAY, n, date)
Treasure Data (DATE)
DATE_ADD('day', n, date)
Athena (DATE)
DATE_ADD('day', n, date)
MySQL (DATE)
DATE_ADD(date, INTERVAL n DAY)
Oracle (DATE)
date + n
Tips
- BigQuery: date → INTERVAL順
- Snowflake: 単位 → 数値 → 日付順
- Treasure Data: 単位は文字列
- Athena: 単位は文字列
- MySQL: BigQueryと同じ構文
- Oracle: 算術演算
日付差分
BigQuery (INT64)
DATE_DIFF(end_date, start_date, DAY)
Snowflake (NUMBER)
DATEDIFF(DAY, start_date, end_date)
Treasure Data (BIGINT)
DATE_DIFF('day', start_date, end_date)
Athena (BIGINT)
DATE_DIFF('day', start_date, end_date)
MySQL (INT)
DATEDIFF(end_date, start_date)
Oracle (NUMBER)
end_date - start_date
Tips
- BigQuery: 日付順に注意
- Snowflake: 開始→終了順
- Treasure Data: 単位は文字列
- Athena: 単位は文字列
- MySQL: 単位指定なし(日のみ)
- Oracle: 算術演算(日数)
月間差分
BigQuery (INT64)
DATE_DIFF(date2, date1, MONTH)
Snowflake (NUMBER)
DATEDIFF('month', date1, date2)
Treasure Data (BIGINT)
DATE_DIFF('month', date1, date2)
Athena (BIGINT)
DATE_DIFF('month', date1, date2)
MySQL (INT)
TIMESTAMPDIFF(MONTH, date1, date2)
Oracle (NUMBER)
MONTHS_BETWEEN(date2, date1)
Tips
- BigQuery: 月単位の差分
- Snowflake: 月単位の差分
- Treasure Data: 月単位の差分
- Athena: 月単位の差分
- MySQL: 月単位の差分
- Oracle: 小数点以下も含む
年間差分
BigQuery (INT64)
DATE_DIFF(date2, date1, YEAR)
Snowflake (NUMBER)
DATEDIFF('year', date1, date2)
Treasure Data (BIGINT)
DATE_DIFF('year', date1, date2)
Athena (BIGINT)
DATE_DIFF('year', date1, date2)
MySQL (INT)
TIMESTAMPDIFF(YEAR, date1, date2)
Oracle (NUMBER)
EXTRACT(YEAR FROM date2) - EXTRACT(YEAR FROM date1)
Tips
- BigQuery: 年単位の差分
- Snowflake: 年単位の差分
- Treasure Data: 年単位の差分
- Athena: 年単位の差分
- MySQL: 年単位の差分
- Oracle: 年の差分のみ(月日は考慮せず、2023-12-31と2024-01-01は1年差)
年抽出
BigQuery (INT64)
EXTRACT(YEAR FROM timestamp)
Snowflake (NUMBER)
EXTRACT(YEAR FROM timestamp)
Treasure Data (BIGINT)
EXTRACT(YEAR FROM timestamp)
Athena (BIGINT)
EXTRACT(YEAR FROM timestamp)
MySQL (INT)
YEAR(date)
Oracle (NUMBER)
EXTRACT(YEAR FROM date)
Tips
- MySQL: EXTRACT()も使用可能
月抽出
BigQuery (INT64)
EXTRACT(MONTH FROM timestamp)
Snowflake (NUMBER)
EXTRACT(MONTH FROM timestamp)
Treasure Data (BIGINT)
EXTRACT(MONTH FROM timestamp)
Athena (BIGINT)
EXTRACT(MONTH FROM timestamp)
MySQL (INT)
MONTH(date)
Oracle (NUMBER)
EXTRACT(MONTH FROM date)
Tips
- MySQL: EXTRACT()も使用可能
日抽出
BigQuery (INT64)
EXTRACT(DAY FROM timestamp)
Snowflake (NUMBER)
EXTRACT(DAY FROM timestamp)
Treasure Data (BIGINT)
EXTRACT(DAY FROM timestamp)
Athena (BIGINT)
EXTRACT(DAY FROM timestamp)
MySQL (INT)
DAY(date)
Oracle (NUMBER)
EXTRACT(DAY FROM date)
曜日取得
BigQuery (INT64)
EXTRACT(DAYOFWEEK FROM date)
Snowflake (NUMBER)
DAYOFWEEK(date)
Treasure Data (BIGINT)
DAY_OF_WEEK(date)
Athena (BIGINT)
DAY_OF_WEEK(date)
MySQL (INT)
DAYOFWEEK(date)
Oracle (NUMBER)
TO_NUMBER(TO_CHAR(date, 'D'))
Tips
- BigQuery: 1=日曜日
- Snowflake: Snowflakeは日曜=0から開始(他多くのDBは日曜=1)
- Treasure Data: 1=月曜日
- Athena: 1=月曜日, 7=日曜日 (ISO基準)
- MySQL: 1=日曜日
- Oracle: 'D'の値はNLS_TERRITORY依存。固定する場合はTO_CHAR(date,'D','NLS_TERRITORY=AMERICA')等で明示
日付フォーマット
BigQuery (STRING)
-- DATE型の場合
FORMAT_DATE('%Y-%m-%d', date)
-- TIMESTAMP型の場合
FORMAT_TIMESTAMP('%Y-%m-%d', timestamp)
Snowflake (STRING)
TO_CHAR(date, 'YYYY-MM-DD')
Treasure Data (VARCHAR)
DATE_FORMAT(date, '%Y-%m-%d')
Athena (VARCHAR)
DATE_FORMAT(date, '%Y-%m-%d')
MySQL (VARCHAR)
DATE_FORMAT(date, '%Y-%m-%d')
Oracle (VARCHAR2)
TO_CHAR(date, 'YYYY-MM-DD')
Tips
- BigQuery: DATE型にはFORMAT_DATE、TIMESTAMP型にはFORMAT_TIMESTAMPを使用
- Snowflake: Oracle形式
- Treasure Data: MySQL形式
- Athena: MySQL形式
- MySQL: 独自形式
- Oracle: 独自形式
文字列から日付
BigQuery (DATE)
PARSE_DATE('%Y-%m-%d', string)
Snowflake (DATE)
TO_DATE(string[, <format>])
Treasure Data (TIMESTAMP)
DATE_PARSE(string, '%Y-%m-%d')
Athena (TIMESTAMP)
DATE_PARSE(string, '%Y-%m-%d')
MySQL (DATE)
STR_TO_DATE(string, '%Y-%m-%d')
Oracle (DATE)
TO_DATE(string, 'YYYY-MM-DD')
Tips
- BigQuery: strftime形式
- Snowflake: Oracle形式
- Treasure Data: DATE_PARSEだがTIMESTAMP型を返す(Presto仕様)
- Athena: DATE_PARSEだがTIMESTAMP型を返す(Presto仕様)
- MySQL: 独自形式
- Oracle: 独自形式
月末取得
BigQuery (DATE)
LAST_DAY(date, MONTH)
Snowflake (DATE)
LAST_DAY(date)
Treasure Data (DATE)
LAST_DAY_OF_MONTH(date)
Athena (DATE)
LAST_DAY_OF_MONTH(date)
MySQL (DATE)
LAST_DAY(date)
Oracle (DATE)
LAST_DAY(date)
四半期末取得
BigQuery (DATE)
LAST_DAY(date, QUARTER)
Snowflake (DATE)
LAST_DAY(date, 'quarter')
Treasure Data (DATE)
DATE(DATE_TRUNC('quarter', date) + INTERVAL '3' MONTH - INTERVAL '1' DAY)
Athena (DATE)
DATE(DATE_TRUNC('quarter', date) + INTERVAL '3' MONTH - INTERVAL '1' DAY)
MySQL (DATE)
N/A - 手動計算が必要
Oracle (DATE)
LAST_DAY(ADD_MONTHS(TRUNC(date, 'Q'), 2))
Tips
- BigQuery: 四半期末日
- Snowflake: 四半期末日
- Treasure Data: 手動計算
- Athena: 手動計算
- MySQL: 手動計算
- Oracle: 四半期末計算
年末取得
BigQuery (DATE)
LAST_DAY(date, YEAR)
Snowflake (DATE)
LAST_DAY(date, 'year')
Treasure Data (DATE)
DATE(DATE_TRUNC('year', date) + INTERVAL '1' YEAR - INTERVAL '1' DAY)
Athena (DATE)
DATE(DATE_TRUNC('year', date) + INTERVAL '1' YEAR - INTERVAL '1' DAY)
MySQL (DATE)
STR_TO_DATE(CONCAT(YEAR(date), '-12-31'), '%Y-%m-%d')
Oracle (DATE)
TO_DATE(TO_CHAR(date, 'YYYY') || '-12-31', 'YYYY-MM-DD')
Tips
- BigQuery: 年末日
- Snowflake: 年末日
- Treasure Data: 手動計算
- Athena: 手動計算
- MySQL: 手動計算
- Oracle: 年末日計算
年内日数取得
BigQuery (INT64)
EXTRACT(DAYOFYEAR FROM date)
Snowflake (NUMBER)
DAYOFYEAR(date)
Treasure Data (BIGINT)
DAY_OF_YEAR(date)
Athena (BIGINT)
DAY_OF_YEAR(date)
MySQL (INT)
DAYOFYEAR(date)
Oracle (NUMBER)
TO_NUMBER(TO_CHAR(date, 'DDD'))
Tips
- BigQuery: 年内の通算日数
- Snowflake: 年内の通算日数
- Treasure Data: 年内の通算日数
- Athena: 年内の通算日数
- MySQL: 年内の通算日数
- Oracle: 年内の通算日数
週の切り詰め
BigQuery (DATE)
DATE_TRUNC(date, WEEK(MONDAY))
Snowflake (DATE)
DATE_TRUNC('week', date)
Treasure Data (DATE)
DATE_TRUNC('week', date)
Athena (DATE)
DATE_TRUNC('week', date)
MySQL (DATE)
DATE_SUB(date, INTERVAL WEEKDAY(date) DAY)
Oracle (DATE)
TRUNC(date, 'IW')
Tips
- BigQuery: 月曜開始週
- Snowflake: WEEK_STARTパラメータ依存(デフォルトは月曜)
- Treasure Data: 月曜開始週
- Athena: 月曜開始週
- MySQL: 月曜開始週
- Oracle: ISO週、月曜開始
月の切り詰め
BigQuery (DATE)
DATE_TRUNC(date, MONTH)
Snowflake (DATE)
DATE_TRUNC('month', date)
Treasure Data (DATE)
DATE_TRUNC('month', date)
Athena (DATE)
DATE_TRUNC('month', date)
MySQL (DATE)
DATE_SUB(date, INTERVAL DAYOFMONTH(date)-1 DAY)
Oracle (DATE)
TRUNC(date, 'MONTH')
四半期の切り詰め
BigQuery (DATE)
DATE_TRUNC(date, QUARTER)
Snowflake (DATE)
DATE_TRUNC('quarter', date)
Treasure Data (DATE)
DATE_TRUNC('quarter', date)
Athena (DATE)
DATE_TRUNC('quarter', date)
MySQL (DATE)
STR_TO_DATE(CONCAT(YEAR(date), '-', (QUARTER(date)-1)*3+1, '-01'), '%Y-%m-%d')
Oracle (DATE)
TRUNC(date, 'Q')
Tips
- BigQuery: 四半期初日
- Snowflake: 四半期初日
- Treasure Data: 四半期初日
- Athena: 四半期初日
- MySQL: 手動計算
- Oracle: 四半期初日
年の切り詰め
BigQuery (DATE)
DATE_TRUNC(date, YEAR)
Snowflake (DATE)
DATE_TRUNC('year', date)
Treasure Data (DATE)
DATE_TRUNC('year', date)
Athena (DATE)
DATE_TRUNC('year', date)
MySQL (DATE)
DATE_SUB(date, INTERVAL DAYOFYEAR(date)-1 DAY)
Oracle (DATE)
TRUNC(date, 'YEAR')
週番号取得
BigQuery (INT64)
EXTRACT(WEEK FROM date)
Snowflake (NUMBER)
WEEKOFYEAR(date)
Treasure Data (BIGINT)
WEEK_OF_YEAR(date)
Athena (BIGINT)
WEEK_OF_YEAR(date)
MySQL (INT)
WEEK(date)
Oracle (NUMBER)
TO_NUMBER(TO_CHAR(date, 'WW'))
Tips
- BigQuery: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- Snowflake: WEEKOFYEARはISO週番号(月曜開始固定)。WEEK_STARTパラメータの影響を受けない
- Treasure Data: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- Athena: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- MySQL: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- Oracle: WWは暦年起点で非ISO。ISO週番号はTO_CHAR(date, 'IW')を使用
ISO週番号取得
BigQuery (INT64)
EXTRACT(ISOWEEK FROM date)
Snowflake (NUMBER)
WEEKISO(date)
Treasure Data (BIGINT)
week_of_year(date)
Athena (BIGINT)
week_of_year(date)
MySQL (INT)
WEEKOFYEAR(date)
Oracle (NUMBER)
TO_NUMBER(TO_CHAR(date, 'IW'))
Tips
- BigQuery: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- Snowflake: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- Treasure Data: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- Athena: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- MySQL: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
- Oracle: ISO 8601準拠。年の最初の数日が前年の最終週に属する場合がある
UNIXTIMEから日付
BigQuery (TIMESTAMP)
TIMESTAMP_SECONDS(unix_seconds)
Snowflake (TIMESTAMP)
TO_TIMESTAMP(unix_seconds)
Treasure Data (TIMESTAMP)
FROM_UNIXTIME(unix_seconds)
Athena (TIMESTAMP)
FROM_UNIXTIME(unix_seconds)
MySQL (DATETIME)
FROM_UNIXTIME(unix_seconds)
Oracle (DATE)
DATE '1970-01-01' + (unix_seconds / 86400)
Tips
- BigQuery: 秒精度、UTC基準
- Snowflake: 秒精度、自動変換
- Treasure Data: 秒精度、セッションタイムゾーン依存
- Athena: 秒精度、セッションタイムゾーン依存
- MySQL: 秒精度、ローカル時間
- Oracle: 手動計算、秒精度まで対応
UNIXTIMEから文字列
BigQuery (STRING)
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_SECONDS(unix_seconds))
Snowflake (VARCHAR)
TO_VARCHAR(TO_TIMESTAMP(unix_seconds), 'YYYY-MM-DD HH24:MI:SS')
Treasure Data (VARCHAR)
DATE_FORMAT(FROM_UNIXTIME(unix_seconds), '%Y-%m-%d %H:%i:%s')
Athena (VARCHAR)
DATE_FORMAT(FROM_UNIXTIME(unix_seconds), '%Y-%m-%d %H:%i:%s')
MySQL (VARCHAR)
FROM_UNIXTIME(unix_seconds, '%Y-%m-%d %H:%i:%s')
Oracle (VARCHAR2)
TO_CHAR(DATE '1970-01-01' + (unix_seconds / 86400), 'YYYY-MM-DD HH24:MI:SS')
Tips
- BigQuery: フォーマット指定
- Snowflake: フォーマット指定
- Treasure Data: フォーマット指定
- Athena: フォーマット指定
- MySQL: フォーマット指定
- Oracle: 手動計算+フォーマット
文字列からUNIXTIME
BigQuery (INT64)
UNIX_SECONDS(PARSE_TIMESTAMP('%Y-%m-%d %H:%M:%S', string))
Snowflake (NUMBER)
EXTRACT(EPOCH FROM TO_TIMESTAMP(string))
Treasure Data (DOUBLE)
TO_UNIXTIME(CAST(string AS TIMESTAMP))
Athena (DOUBLE)
TO_UNIXTIME(CAST(string AS TIMESTAMP))
MySQL (INT)
UNIX_TIMESTAMP(string)
Oracle (NUMBER)
(CAST(TO_TIMESTAMP(string, format) AS DATE) - DATE '1970-01-01') * 86400
Tips
- BigQuery: フォーマット指定必要
- Snowflake: 自動フォーマット判定
- Treasure Data: ISO8601推奨
- Athena: ISO8601推奨
- MySQL: MySQL日付フォーマット
- Oracle: 手動計算必要
UNIXTIME差分計算
BigQuery (INT64)
UNIX_SECONDS(timestamp2) - UNIX_SECONDS(timestamp1)
Snowflake (NUMBER)
EXTRACT(EPOCH FROM timestamp2) - EXTRACT(EPOCH FROM timestamp1)
Treasure Data (DOUBLE)
TO_UNIXTIME(timestamp2) - TO_UNIXTIME(timestamp1)
Athena (DOUBLE)
TO_UNIXTIME(timestamp2) - TO_UNIXTIME(timestamp1)
MySQL (INT)
UNIX_TIMESTAMP(timestamp2) - UNIX_TIMESTAMP(timestamp1)
Oracle (NUMBER)
((CAST(timestamp2 AS DATE) - CAST(timestamp1 AS DATE)) * 86400)
Tips
- BigQuery: 秒単位の差分
- Snowflake: 秒単位の差分
- Treasure Data: 秒単位の差分
- Athena: 秒単位の差分
- MySQL: 秒単位の差分
- Oracle: TIMESTAMP型はDATEにキャストしてから差分計算
ミリ秒UNIXTIME取得
BigQuery (INT64)
UNIX_MILLIS(CURRENT_TIMESTAMP())
Snowflake (NUMBER)
DATE_PART('epoch_millisecond', CURRENT_TIMESTAMP())
Treasure Data (DOUBLE)
TO_UNIXTIME(CURRENT_TIMESTAMP) * 1000
Athena (DOUBLE)
TO_UNIXTIME(CURRENT_TIMESTAMP) * 1000
MySQL (DECIMAL)
UNIX_TIMESTAMP() * 1000
Oracle (NUMBER)
ROUND((SYSDATE - DATE '1970-01-01') * 86400 * 1000)
Tips
- BigQuery: ミリ秒精度
- Snowflake: ミリ秒精度
- Treasure Data: 秒を1000倍
- Athena: 秒を1000倍
- MySQL: 秒を1000倍
- Oracle: SYSDATEベース。EXTRACT(EPOCH...)は未対応
マイクロ秒UNIXTIME取得
BigQuery (INT64)
UNIX_MICROS(CURRENT_TIMESTAMP())
Snowflake (NUMBER)
DATE_PART('epoch_microsecond', CURRENT_TIMESTAMP())
Treasure Data (DOUBLE)
TO_UNIXTIME(CURRENT_TIMESTAMP) * 1000000
Athena (DOUBLE)
TO_UNIXTIME(CURRENT_TIMESTAMP) * 1000000
MySQL (DECIMAL)
UNIX_TIMESTAMP(NOW(6)) * 1000000
Oracle (N/A)
非対応
Tips
- BigQuery: マイクロ秒精度
- Snowflake: マイクロ秒精度
- Treasure Data: 秒を1000000倍
- Athena: 秒を1000000倍
- MySQL: マイクロ秒対応
- Oracle: マイクロ秒精度サポートなし
他のカテゴリ
各DBのバージョンやエディションにより動作が異なる場合があります。本番環境での使用前に必ずテストしてください。