対応エンジン
| エンジン | 対応 | 備考 |
|---|---|---|
| TD(Presto) | ✅ | TD_TIME_PARSEはTD固有関数 |
| Trino / Presto | ⚠️ | to_unixtime + date_parseを使う |
| Hive | ⚠️ | unix_timestampを使う |
こんなときに使う
外部システムから取り込んだデータや手動で作成したマスタテーブルに'2024-01-01'のような文字列で日付が入っているケースがあります。TD_TIME_RANGEでの絞り込みや日付計算に使うためにUNIXタイムに変換したい場面で使います。
TDでの実装
入力例:'2024-01-01'
出力例:1704034800
SELECT
TD_TIME_PARSE('2024-01-01', 'Asia/Tokyo') AS unix_timeいろいろな文字列フォーマットに対応できる
-- ハイフン区切り(最も一般的)
TD_TIME_PARSE('2024-01-01', 'Asia/Tokyo')
-- → 1704034800
-- スラッシュ区切り
TD_TIME_PARSE('2024/01/01', 'Asia/Tokyo')
-- → 1704034800
-- 日時込み
TD_TIME_PARSE('2024-01-01 09:00:00', 'Asia/Tokyo')
-- → 1704067200
カラムに入っている文字列を変換する
SELECT
TD_TIME_PARSE(date_col, 'Asia/Tokyo') AS unix_time
FROM your_table
Trino / Prestoでの実装
TD_TIME_PARSEは使えないため、date_parseとto_unixtimeを組み合わせます。
SELECT
to_unixtime(
date_parse(date_col, '%Y-%m-%d')
AT TIME ZONE 'Asia/Tokyo'
) AS unix_time
FROM your_table
date_parseで文字列をTIMESTAMP型に変換してからto_unixtimeでUNIXタイムに変換します。
フォーマット文字列はTDと異なり%Y-%m-%d形式を使います。
Trino/Prestoのフォーマット記号
| 記号 | 意味 | 例 |
|---|---|---|
%Y | 年(4桁) | 2024 |
%m | 月(2桁) | 01 |
%d | 日(2桁) | 01 |
%H | 時(24時間) | 09 |
%i | 分 | 30 |
%s | 秒 | 00 |
-- スラッシュ区切りの場合
to_unixtime(
date_parse(date_col, '%Y/%m/%d')
AT TIME ZONE 'Asia/Tokyo'
)
-- 日時込みの場合
to_unixtime(
date_parse(date_col, '%Y-%m-%d %H:%i:%s')
AT TIME ZONE 'Asia/Tokyo'
)Hiveでの実装
SELECT
unix_timestamp(date_col, 'yyyy-MM-dd') AS unix_time
FROM your_tableunix_timestamp(文字列, フォーマット)で日付文字列をUNIXタイムに変換します。
タイムゾーンはHiveのセッション設定に依存します。
-- スラッシュ区切りの場合
unix_timestamp(date_col, 'yyyy/MM/dd')
-- 日時込みの場合
unix_timestamp(date_col, 'yyyy-MM-dd HH:mm:ss')エンジン別まとめ
| エンジン | 関数 | タイムゾーン指定 |
|---|---|---|
| TD | TD_TIME_PARSE(date_col, timezone) | 第2引数に指定 |
| Trino / Presto | to_unixtime(date_parse(...) AT TIME ZONE ...) | AT TIME ZONEで指定 |
| Hive | unix_timestamp(date_col, format) | セッション設定に依存 |
⚠️ よくあるミス
8桁文字列をそのまま渡す
-- ❌ ハイフンなしはNULLになる
TD_TIME_PARSE('20240101', 'Asia/Tokyo')
-- ✅ SUBSTR+CONCATでハイフン区切りにしてから渡す
TD_TIME_PARSE(
CONCAT(
SUBSTR('20240101', 1, 4), '-',
SUBSTR('20240101', 5, 2), '-',
SUBSTR('20240101', 7, 2)
),
'Asia/Tokyo'
)
-- → 詳しくは[日付]整数8桁をUNIXタイムに変換する方法を参照
タイムゾーンを省略する
-- ❌ UTCで解釈されてしまい9時間ずれる
TD_TIME_PARSE('2024-01-01')
-- ✅ 必ずAsia/Tokyoを指定
TD_TIME_PARSE('2024-01-01', 'Asia/Tokyo')よくある応用:文字列の日付カラムで期間を絞り込む
SELECT *
FROM your_table
WHERE TD_TIME_RANGE(
time,
TD_TIME_PARSE('2024-01-01', 'Asia/Tokyo'),
TD_TIME_PARSE('2024-02-01', 'Asia/Tokyo')
)まとめ
| ポイント | 内容 |
|---|---|
| TD基本形 | TD_TIME_PARSE(date_col, 'Asia/Tokyo') |
| タイムゾーン必須 | 省略するとUTCで9時間ずれる |
| 8桁文字列は直接NG | 事前にハイフン区切りの文字列に変換する |
| Trinoはフォーマット記号が異なる | yyyyではなく%Y形式を使う |