本文へ移動
SQL 更新日: 2026年4月30日 約6分で読めます

Treasure Data SQLで今日の日付・現在時刻を取得する方法

対応エンジン

エンジン対応備考
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 today

Hiveでの実装

-- 現在時刻をUNIXタイムで取得
SELECT unix_timestamp() AS now_unix

-- 今日の日付を取得
SELECT current_date AS today

-- 今日の日付を文字列フォーマットで取得
SELECT from_unixtime(unix_timestamp(), 'yyyy-MM-dd') AS today

エンジン別まとめ

エンジンUNIXタイム取得日付文字列取得
TDTD_SCHEDULED_TIME()TD_TIME_FORMAT(TD_SCHEDULED_TIME(), 'yyyy-MM-dd', 'Asia/Tokyo')
Trino / Prestoto_unixtime(now())format_datetime(now() AT TIME ZONE 'Asia/Tokyo', 'yyyy-MM-dd')
Hiveunix_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(), ...)文字列日付を人間が読める形で出力

次のアクション

SQLやデータ活用を、手元で試しながら理解する

記事で読んだ考え方を、SQL練習場や関連カテゴリの記事でさらに深掘りできます。相談やご依頼もお問い合わせページから受け付けています。

SQL練習場で試す お問い合わせ

この記事を書いた人:martechfarm

Treasure Data Top Lapidarist Award受賞。

SQL / Digdag / Python / CDP設計 / CRM設計を横断し、企業のデータ活用を支援。

実績・支援内容を見る →

MarTech Farmをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む