メインコンテンツにスキップ
モジュール 6 · レッスン 2 / 4コース内の 22/57~12 min
モジュールのレッスン (2/4)

日付とタイムスタンプの関数

日付とタイムスタンプは、注文、ログイン、イベント、請求などあらゆる場所に存在します。で このレッスンでは、日付 (年、月など) から 部分を抽出する方法を見ていきます。 それを粒度 (月、週など) に切り捨てし、間隔を計算します と差異を確認し、期間をまたいで比較します。

基本タイプ

PostgreSQL は次の点を区別します。

  • DATE — 日付のみ、形式は YYYY-MM-DD;
  • TIMESTAMP — 日付 + 時刻、タイムゾーンなし。
  • TIMESTAMPTZ — 日付 + 時刻 + タイムゾーン;
  • INTERVAL — ピリオド (例: '3 days'、'2 hours 30 minutes')。

ecommerce データセットでは次のようになります。

コラムタイプ
customers.signed_up_onDATE
orders.ordered_atTIMESTAMP
orders.shipped_atTIMESTAMP (NULL の場合もあります)

EXTRACT — 部分を読む

EXTRACT(part FROM date) は数値を抽出します。

SQL
SELECT EXTRACT(YEAR  FROM ordered_at) AS year,
       EXTRACT(MONTH FROM ordered_at) AS month,
       EXTRACT(DOW   FROM ordered_at) AS day_of_week  -- 0=domenica
FROM   orders;

最も使用されるパーツ: YEAR、MONTH、DAY、HOUR、MINUTE、DOW (日) 第 0 週から第 6 週まで)、DOY (年間の日)。

DATE_TRUNC — 切り捨て

DATE_TRUNC('part', date) 日付を細かい単位で「切り捨て」ます。それは 月、週、時間ごとに集計する場合に必須:

SQL
-- Tutti gli ordini fatti in "marzo 2025" cadono nello stesso bucket:
SELECT DATE_TRUNC('month', ordered_at) AS month,
       COUNT(*) AS order_count
FROM   orders
GROUP BY month
ORDER BY month;

有効な部分: 'year'、'quarter'、'month'、'week'、'day'、 'hour'、'minute'、'second'。

読みやすさを考慮して、時間が必要ない場合は DATE にキャストすることがよくあります。 DATE_TRUNC('month', ordered_at)::date。

違いと間隔

2 つの TIMESTAMP を減算すると、INTERVAL が生成されます。

SQL
SELECT id,
       shipped_at - ordered_at AS wait_time
FROM   orders
WHERE  shipped_at IS NOT NULL;

INTERVAL リテラルとの比較:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

日付に日数を追加する:

SQL
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM   customers;

試してみてください

運動#sql.m6.l2.e1
試行回数: 0読み込み中…

年間にどれだけの注文があったかを数えてください。 2 つの列: year (整数) と order_count。年順に昇順に並べます。

エディターを読み込み中…
ヒントを表示

EXTRACT(YEAR FROM requested_at) は NUMERIC を返します。読みやすくするために ::int を使用して int にキャストします。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m6.l2.e2
試行回数: 0読み込み中…

2024 年の各月について、月の最初の日 (日付タイプの列月) と注文数を表示します。月ごとにご注文ください。

エディターを読み込み中…
ヒントを表示

DATE_TRUNC('month', requested_at) は、月の最初の日をタイムスタンプとして返​​します。 ::date は日付に変換します。

3 回の試行後に解決策が利用可能になります