対応エンジン
| エンジン | 対応 | 備考 |
|---|---|---|
| TD(Presto) | ✅ | TD_SCHEDULED_TIMEはTD固有関数 |
| Trino / Presto | ⚠️ | now()・current_timestampを使う |
| Hive | ⚠️ | unix_timestamp()・current_dateを使う |
こんなときに使う
「今日時点のデータだけ取りたい」「レポートに実行日を表示したい」「直近N日を動的に指定したい」など、実行時の日付を基準にしたいときに使います。
TDでの実装
TDで現在時刻を取得する方法は主に3つあります。目的によって使い分けが重要です。
-- ① スケジュール実行時刻をUNIXタイムで取得(推奨)
SELECT TD_SCHEDULED_TIME() AS now_unix
-- ② クエリ実行時刻をUNIXタイムで取得
SELECT UNIX_TIMESTAMP() AS now_unix
-- ③ 今日の日付を文字列で取得
SELECT TD_TIME_FORMAT(TD_SCHEDULED_TIME(), 'yyyy-MM-dd', 'Asia/Tokyo') AS today
① TD_SCHEDULED_TIME()【スケジュール実行で推奨】
SELECT TD_SCHEDULED_TIME() AS now_unix
-- → 1704034800スケジュールされた実行時刻を返すTD固有関数です。処理に多少の遅延が生じても常に定刻の時刻を返すため、スケジュール実行の基準時刻には必ずこちらを使います。手動実行時はクエリ実行時刻を返します。
② UNIX_TIMESTAMP()【手動実行・デバッグ時】
SELECT UNIX_TIMESTAMP() AS now_unix
-- → 1704034823クエリを実行した瞬間の時刻を返します。スケジュール実行で使うと処理の遅延によって毎回微妙に値がズレるため、日付集計の基準には向きません。
③ 今日の日付を文字列で取得
SELECT
TD_TIME_FORMAT(TD_SCHEDULED_TIME(), 'yyyy-MM-dd', 'Asia/Tokyo') AS today
-- → '2024-01-01'BIツールへの出力やレポートの日付表示に使います。
Trino / Prestoでの実装
-- 現在時刻をTIMESTAMP型で取得
SELECT now() AS current_time
-- 現在時刻をタイムゾーン付きで取得
SELECT now() AT TIME ZONE 'Asia/Tokyo' AS current_time_jst
-- 今日の日付を取得
SELECT current_date AS today
-- UNIXタイムに変換
SELECT to_unixtime(now()) AS now_unix
-- 日付文字列で取得
SELECT format_datetime(now() AT TIME ZONE 'Asia/Tokyo', 'yyyy-MM-dd') AS todayHiveでの実装
-- 現在時刻をUNIXタイムで取得
SELECT unix_timestamp() AS now_unix
-- 今日の日付を取得
SELECT current_date AS today
-- 今日の日付を文字列フォーマットで取得
SELECT from_unixtime(unix_timestamp(), 'yyyy-MM-dd') AS todayエンジン別まとめ
| エンジン | UNIXタイム取得 | 日付文字列取得 |
|---|---|---|
| TD | TD_SCHEDULED_TIME() | TD_TIME_FORMAT(TD_SCHEDULED_TIME(), 'yyyy-MM-dd', 'Asia/Tokyo') |
| Trino / Presto | to_unixtime(now()) | format_datetime(now() AT TIME ZONE 'Asia/Tokyo', 'yyyy-MM-dd') |
| Hive | unix_timestamp() | current_date |
⚠️ よくあるミス
スケジュール実行でUNIX_TIMESTAMPを使う
-- ❌ 処理の遅延で毎回わずかに値がズレる
WHERE TD_TIME_RANGE(
time,
UNIX_TIMESTAMP() - 86400,
UNIX_TIMESTAMP()
)
-- ✅ スケジュール実行では必ずTD_SCHEDULED_TIMEを使う
WHERE TD_TIME_RANGE(
time,
TD_SCHEDULED_TIME() - 86400,
TD_SCHEDULED_TIME()
)タイムゾーンを省略して日付がずれる
-- ❌ UTCで解釈されてしまい日本時間の午前9時前は前日になる
TD_TIME_FORMAT(TD_SCHEDULED_TIME(), 'yyyy-MM-dd')
-- ✅ 必ずAsia/Tokyoを指定
TD_TIME_FORMAT(TD_SCHEDULED_TIME(), 'yyyy-MM-dd', 'Asia/Tokyo')よくある応用
直近30日のデータを動的に取得(TD)
SELECT *
FROM your_table
WHERE TD_TIME_RANGE(
time,
TD_SCHEDULED_TIME() - 86400 * 30,
TD_SCHEDULED_TIME()
)今日のデータだけ取得(TD)
SELECT *
FROM your_table
WHERE TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'Asia/Tokyo')
= TD_TIME_FORMAT(TD_SCHEDULED_TIME(), 'yyyy-MM-dd', 'Asia/Tokyo')
まとめ
| 関数 | 返り値 | 使いどころ |
|---|---|---|
TD_SCHEDULED_TIME() | UNIXタイム | スケジュール実行の基準時刻 |
UNIX_TIMESTAMP() | UNIXタイム | 手動実行・デバッグ |
TD_TIME_FORMAT(TD_SCHEDULED_TIME(), ...) | 文字列 | 日付を人間が読める形で出力 |