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

Treasure Data SQLでUNIXタイムを日付文字列に変換する方法

対応エンジン

エンジン対応備考
TD(Presto)TD_TIME_FORMATはTD固有関数
Trino / Presto⚠️format_datetime + from_unixtimeを使う
Hive⚠️from_unixtimeを使う

こんなときに使う

TDのテーブルではtimeカラムがUNIXタイム(秒)で格納されています。
レポートやBIツールへの出力時に2024-01-012024年1月のような人間が読める形式に変換したい場面で使います。


TDでの実装

入力例:1704034800
出力例:'2024-01-01'

SELECT
  TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'Asia/Tokyo') AS date_str
FROM your_table

フォーマット一覧

-- 日付のみ
TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'Asia/Tokyo')
-- → '2024-01-01'

-- 日時
TD_TIME_FORMAT(time, 'yyyy-MM-dd HH:mm:ss', 'Asia/Tokyo')
-- → '2024-01-01 09:00:00'

-- 年月のみ(月次集計に便利)
TD_TIME_FORMAT(time, 'yyyy-MM', 'Asia/Tokyo')
-- → '2024-01'

-- 年のみ
TD_TIME_FORMAT(time, 'yyyy', 'Asia/Tokyo')
-- → '2024'

-- 日本語表記
TD_TIME_FORMAT(time, 'yyyy年MM月dd日', 'Asia/Tokyo')
-- → '2024年01月01日'

-- 曜日付き
TD_TIME_FORMAT(time, 'yyyy-MM-dd (E)', 'Asia/Tokyo')
-- → '2024-01-01 (Mon)'

フォーマット記号の意味

記号意味
yyyy年(4桁)2024
MM月(2桁・ゼロ埋め)01
M月(ゼロ埋めなし)1
dd日(2桁・ゼロ埋め)01
d日(ゼロ埋めなし)1
HH時(24時間)09
mm30
ss00
E曜日(短縮)Mon
EEEE曜日(フル)Monday

Trino / Prestoでの実装

TD_TIME_FORMATは使えないため、from_unixtimeformat_datetimeを組み合わせます。

SELECT
  format_datetime(
    from_unixtime(time) AT TIME ZONE 'Asia/Tokyo',
    'yyyy-MM-dd'
  ) AS date_str
FROM your_table
-- 日時込み
format_datetime(
  from_unixtime(time) AT TIME ZONE 'Asia/Tokyo',
  'yyyy-MM-dd HH:mm:ss'
)
-- → '2024-01-01 09:00:00'

-- 年月のみ
format_datetime(
  from_unixtime(time) AT TIME ZONE 'Asia/Tokyo',
  'yyyy-MM'
)
-- → '2024-01'

Hiveでの実装

Hiveではfrom_unixtime一発で変換できます。

SELECT
  from_unixtime(time, 'yyyy-MM-dd') AS date_str
FROM your_table
-- 日時込み
from_unixtime(time, 'yyyy-MM-dd HH:mm:ss')
-- → '2024-01-01 09:00:00'

-- 年月のみ
from_unixtime(time, 'yyyy-MM')
-- → '2024-01'

タイムゾーンはHiveのセッション設定に依存します。


エンジン別まとめ

エンジン関数タイムゾーン指定
TDTD_TIME_FORMAT(time, format, timezone)第3引数に指定
Trino / Prestoformat_datetime(from_unixtime(time) AT TIME ZONE ..., format)AT TIME ZONEで指定
Hivefrom_unixtime(time, format)セッション設定に依存

⚠️ よくあるミス

MMmmを間違える

-- ❌ 月のつもりが「分」になってしまう
TD_TIME_FORMAT(time, 'yyyy-mm-dd', 'Asia/Tokyo')
-- → '2024-00-01'(mmは分なので0分が入る)

-- ✅ 月はMM(大文字)
TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'Asia/Tokyo')
-- → '2024-01-01'

タイムゾーンを省略する

-- ❌ UTCで解釈されてしまい9時間ずれる
TD_TIME_FORMAT(time, 'yyyy-MM-dd')
-- → '2023-12-31'(日本時間の午前9時未満は前日になる)

-- ✅ 日本データは必ずAsia/Tokyoを指定
TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'Asia/Tokyo')
-- → '2024-01-01'

よくある応用:月次で集計する

SELECT
  TD_TIME_FORMAT(time, 'yyyy-MM', 'Asia/Tokyo') AS month,
  COUNT(*) AS cnt
FROM your_table
GROUP BY 1
ORDER BY 1

出力例:

monthcnt
2024-011,204
2024-02980
2024-031,531

まとめ

ポイント内容
TD基本形TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'Asia/Tokyo')
フォーマットは自由年月だけ・日時込み・日本語表記なんでもOK
MMとmmは別物月は大文字MM、分は小文字mm
タイムゾーン必須省略するとUTCで9時間ずれる

次のアクション

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

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

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

この記事を書いた人:martechfarm

Treasure Data Top Lapidarist Award受賞。

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

実績・支援内容を見る →

MarTech Farmをもっと見る

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

続きを読む