Lekcje modułu (2/4)
Funkcje daty i czasu (timestamp)
Daty i znaczniki czasu są wszędzie: zamówienia, loginy, wydarzenia, rozliczenia. w w tej lekcji zobaczymy, jak wyodrębnić części z daty (rok, miesiąc…), skróć to do większej szczegółowości (miesiąc, tydzień…), oblicz interwały i różnice oraz dokonywać porównań między okresami.
Typy podstawowe
PostgreSQL wyróżnia:
DATE— tylko data, formatYYYY-MM-DD;TIMESTAMP— data + godzina, bez strefy czasowej;TIMESTAMPTZ— data + godzina + strefa czasowa;INTERVAL– kropka (np.'3 days','2 hours 30 minutes').
W naszym zestawie danych ecommerce:
| Kolumna | Wpisz |
|---|---|
| KODEF0 | KODEF1 |
| KODEF2 | KODEF3 |
| KODEF4 | TIMESTAMP (może być NULL) |
WYCIĄG — czytanie części
EXTRACT(part FROM date) wyodrębnia liczbę:
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;Najczęściej używane części: YEAR, MONTH, DAY, HOUR, MINUTE, DOW (dzień
tygodnia 0-6), DOY (dzień roku).
DATE_TRUNC — zaokrąglanie w dół
DATE_TRUNC('part', date) „obcina” datę do większej szczegółowości. To jest
niezbędne do agregowania według miesiąca, tygodnia, godziny:
-- 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;Prawidłowe części: 'year', 'quarter', 'month', 'week', 'day',
KODEF5, KODEF6, KODEF7.
Aby zapewnić czytelność, ludzie często rzutują na DATE, gdy nie jest potrzebny czas:
KODEF1.
Różnice i interwały
Odjęcie dwóch TIMESTAMP daje INTERVAL:
SELECT id,
shipped_at - ordered_at AS wait_time
FROM orders
WHERE shipped_at IS NOT NULL;Porównania z literałem INTERVAL:
WHERE shipped_at - ordered_at > INTERVAL '1 day'Dodawanie dni do daty:
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM customers;Spróbuj
Policz, ile zamówień zostało złożonych rocznie. Dwie kolumny: rok (liczba całkowita) i liczba_zamówień. Uporządkuj według roku rosnąco.
Pokaż wskazówkę
WYCIĄG(ROK Z zamówionego_at) zwraca LICZBĘ: rzuć ją na int za pomocą ::int dla czytelności.
Rozwiązanie dostępne po 3 próbach
Przejrzyj ćwiczenie
Dla każdego miesiąca roku 2024 wpisz pierwszy dzień miesiąca (w kolumnie miesiąc, typ data) oraz liczbę zamówień. Zamawiaj według miesiąca.
Pokaż wskazówkę
DATE_TRUNC('miesiąc', zamówione_at) zwraca pierwszy dzień miesiąca jako znacznik czasu; ::date konwertuje go na datę.
Rozwiązanie dostępne po 3 próbach