本文へスキップ
martechfarmDATA & TECHNOLOGY DOCS

すべての記事のタイトル・本文を検索

すべての記事

127 件

タイトルを選ぶと本文が開きます

連続購買をSQLで分析する方法|何ヶ月買い続けているかを判定するクエリ

顧客名寄せをSQLで行う方法|重複IDを統合する実務クエリ

Treasure Data SQLでN日前・N日後の日付を計算する方法

Treasure Data SQLで日付差分を計算する方法|日数・時間数の出し方

Treasure Data SQLで先月・今月の月初月末を取得する方法

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

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

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

Treasure Data SQLで整数8桁の日付をUNIXタイムに変換する方法

異常値・重複データをSQLで検知する方法|データ品質チェックの実務クエリ

クーポン施策の効果をSQLで検証する方法|割引の売上貢献を正しく測る

メルマガの購買転換率をSQLで計測する方法|配信効果を可視化するクエリ

前年同月比・前月比をSQLで計算する方法|売上推移を同時比較するクエリ

バスケット分析をSQLで行う方法|一緒に買われる商品を見つけるクエリ

ABC分析をSQLで実装する方法|売上上位80%の商品を抽出するクエリ

コホート分析をSQLで行う方法|月次リテンション率を可視化するクエリ

新規・既存・復活・休眠顧客をSQLで自動判定する方法

LTVをSQLで計算する方法|顧客生涯価値を正確に出す実務クエリ

RFM分析をSQLだけで実装する方法|顧客ランクを自動分類する実務クエリ

Treasure Data CJOでジャーニーが更新されない原因と確認ポイント

Treasure Data CJOの処理完了を確認する方法|ジョブ状態と実行結果の見方

ポケモン殿堂入りに学ぶ出口戦略|キャリアと事業のゴール設計

ポケモン交換に学ぶ市場原理|需要と供給・ネットワーク効果のビジネス論

ミュウに学ぶ希少性マーケティング|限定性が価値を生む経済学

本文
記事一覧へ ↑

Treasure Data SQLで日付差分を計算する方法|日数・時間数の出し方

対応エンジン

エンジン対応備考
TD(Presto)✅UNIXタイムの差分で計算
Trino / Presto✅date_diff関数が使える
Hive✅datediff関数が使える

こんなときに使う

「初回購買から2回目購買までの日数」「会員登録からの経過日数」「最終ログインから何日空いているか」など、2つの日付の間隔を計算したい場面で使います。


TDでの実装

結論:このSQLを使う

TDではUNIXタイム(秒)同士の差を取って単位で割ります。

SELECT
  -- 日数差
  (unix_time_b - unix_time_a) / 86400 AS diff_days,

  -- 時間差
  (unix_time_b - unix_time_a) / 3600 AS diff_hours,

  -- 分差
  (unix_time_b - unix_time_a) / 60 AS diff_minutes
FROM your_table

入力例:

  • unix_time_a : 1704034800(2024-01-01 00:00:00 JST)
  • unix_time_b : 1706713200(2024-02-01 00:00:00 JST)

出力例:

  • diff_days : 31.0
  • diff_hours : 744.0

小数点を切り捨てたい場合

SELECT
  FLOOR((unix_time_b - unix_time_a) / 86400) AS diff_days
FROM your_table
-- → 31

今日からの経過日数を動的に計算

SELECT
  user_id,
  register_time,
  FLOOR((TD_SCHEDULED_TIME() - register_time) / 86400) AS days_since_register
FROM user_table

Trino / Prestoでの実装

date_diff関数で単位を指定して差分を計算できます。

SELECT
  -- 日数差
  date_diff('day', timestamp_a, timestamp_b) AS diff_days,

  -- 時間差
  date_diff('hour', timestamp_a, timestamp_b) AS diff_hours,

  -- 分差
  date_diff('minute', timestamp_a, timestamp_b) AS diff_minutes,

  -- 月差
  date_diff('month', timestamp_a, timestamp_b) AS diff_months
FROM your_table

UNIXタイムから変換する場合はfrom_unixtimeを組み合わせます。

SELECT
  date_diff(
    'day',
    from_unixtime(unix_time_a) AT TIME ZONE 'Asia/Tokyo',
    from_unixtime(unix_time_b) AT TIME ZONE 'Asia/Tokyo'
  ) AS diff_days
FROM your_table

Hiveでの実装

datediff関数で日数差を計算できます。

SELECT
  -- 日数差(date型またはyyyy-MM-dd形式の文字列を渡す)
  datediff(date_b, date_a) AS diff_days,

  -- 時間差(UNIXタイムから計算)
  (unix_time_b - unix_time_a) / 3600 AS diff_hours
FROM your_table

Hiveのdatediffは日数のみ対応しています。時間・分の差分はTDと同様に秒数差から計算します。


エンジン別まとめ

エンジン日数差時間差月差
TD(unix_b - unix_a) / 86400(unix_b - unix_a) / 3600直接計算不可
Trino / Prestodate_diff('day', a, b)date_diff('hour', a, b)date_diff('month', a, b)
Hivedatediff(b, a)(unix_b - unix_a) / 3600直接計算不可

⚠️ よくあるミス

日付文字列のまま引き算しようとする(TD)

-- ❌ 文字列同士は引き算できない
'2024-02-01' - '2024-01-01'

-- ✅ TD_TIME_PARSEでUNIXタイムに変換してから計算
(
  TD_TIME_PARSE('2024-02-01', 'Asia/Tokyo')
  - TD_TIME_PARSE('2024-01-01', 'Asia/Tokyo')
) / 86400
-- → 31

date_diffの引数の順序を間違える(Trino / Presto)

-- ❌ 順序が逆だと負の値になる
date_diff('day', timestamp_b, timestamp_a)
-- → -31

-- ✅ 古い日付を第2引数・新しい日付を第3引数に
date_diff('day', timestamp_a, timestamp_b)
-- → 31

結果が小数になることを考慮しない(TD)

-- ❌ 時刻がずれていると日数が小数になる
-- unix_time_a = 2024-01-01 00:00:00
-- unix_time_b = 2024-02-01 12:00:00
(unix_time_b - unix_time_a) / 86400
-- → 31.5

-- ✅ FLOOR・CEILで整数に丸める
FLOOR((unix_time_b - unix_time_a) / 86400)
-- → 31

秒数早見表(TD用)

単位秒数
1分60
1時間3600
1日86400
7日(1週間)604800
30日2592000
365日(1年)31536000

よくある応用:初回購買から2回目購買までの日数(TD)

SELECT
  user_id,
  first_purchase_time,
  second_purchase_time,
  FLOOR(
    (second_purchase_time - first_purchase_time) / 86400
  ) AS days_to_repurchase
FROM purchase_table

まとめ

ポイント内容
TDは秒数差で計算(unix_b - unix_a) / 86400で日数差
整数で欲しいFLOORで切り捨て・CEILで切り上げ
Trinoはdate_diffが便利単位を引数で指定できる・月差も取れる
Hiveはdatediffが日数のみ時間差は秒数から計算

MarTech Farmをもっと見る

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

続きを読む