Ana içeriğe geç
Modül 6 · Ders 2 ders 4Kurstaki 22/57~12 min
Modül dersleri (2/4)

Tarih ve zaman damgası işlevleri

Tarihler ve zaman damgaları her yerdedir: siparişler, oturum açma bilgileri, etkinlikler, faturalandırma. içinde Bu derste bir tarihten (yıl, ay…) parçaların nasıl çıkarılacağını göreceğiz, bölün bir ayrıntı düzeyine (ay, hafta…) bölün, aralıklarla hesaplayın ve farklılıkları inceleyip dönemler arasında karşılaştırmalar yapabilirsiniz.

Temel türleri

PostgreSQL şunları ayırt eder:

  • DATE — yalnızca tarih, biçim YYYY-MM-DD;
  • TIMESTAMP — tarih + saat, saat dilimi yok;
  • TIMESTAMPTZ — tarih + saat + saat dilimi;
  • INTERVAL — bir nokta (ör. '3 days', '2 hours 30 minutes').

ecommerce veri kümemizde:

SütunTür
customers.signed_up_onDATE
orders.ordered_atTIMESTAMP
orders.shipped_atTIMESTAMP (NULL olabilir)

EXTRACT — bir bölümü okumak

EXTRACT(part FROM date) bir sayı çıkarır:

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;

En çok kullanılan parçalar: YEAR, MONTH, DAY, HOUR, MINUTE, DOW (gün) 0-6. hafta), DOY (yılın günü).

DATE_TRUNC — aşağı yuvarlama

DATE_TRUNC('part', date) tarihi ayrıntı düzeyine göre "keser". öyle Ay, hafta ve saate göre toplama için gerekli:

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;

Geçerli parçalar: 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second'.

Okunabilirlik açısından, insanlar genellikle zamana gerek olmadığında DATE'ye yayın yapar: DATE_TRUNC('month', ordered_at)::date.

Farklılıklar ve aralıklar

İki TIMESTAMP'nin çıkarılması bir INTERVAL üretir:

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

INTERVAL değişmez değeriyle karşılaştırmalar:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

Bir tarihe gün ekleme:

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

Deneyin

Egzersiz#sql.m6.l2.e1
Denemeler: 0Yükleniyor…

Yılda kaç sipariş verildiğini sayın. İki sütun: yıl (tamsayı) ve order_count. Yıllara göre artan şekilde sıralayın.

Düzenleyici yükleniyor…
İpucu göster

EXTRACT(YEAR FROM order_at) bir NUMERIC döndürür: okunabilirlik için onu ::int ile int'ye aktarın.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m6.l2.e2
Denemeler: 0Yükleniyor…

2024'ün her ayı için ayın ilk gününü (ay sütunu, tarih türü) ve sipariş sayısını gösterin. Aya göre sipariş verin.

Düzenleyici yükleniyor…
İpucu göster

DATE_TRUNC('month',order_at) ayın ilk gününü zaman damgası olarak döndürür; ::date onu tarihe dönüştürür.

3 denemeden sonra çözüm mevcut