PostgreSQL oferuje kilka wbudowanych funkcji do pracy z aktualnymi wartościami czasowymi. Te funkcje są przydatne np. do automatycznego śledzenia czasu utworzenia rekordu, budowania raportów na podstawie bieżącej daty albo sprawdzania, czy zdarzenie miało miejsce w określonym okresie. Zobaczmy trzy podstawowe funkcje: NOW(), CURRENT_DATE i CURRENT_TIME.
NOW(): pobieranie aktualnej daty i czasu
Funkcja NOW() zwraca aktualną datę i czas w formacie TIMESTAMP WITH TIME ZONE. To znaczy, że wynik tej funkcji zawiera dokładny czas z uwzględnieniem strefy czasowej serwera.
Przykład:
SELECT NOW();
-- Wynik: 2025-05-25 14:30:45.761523+03
Zwróć uwagę, że wynik zawiera:
- datę (
2025-05-25), - czas (
14:30:45.761523), - strefę czasową (
+03).
Jeśli nie potrzebujesz strefy czasowej, możesz jawnie przekonwertować wynik na TIMESTAMP:
SELECT NOW()::TIMESTAMP;
-- Wynik: 2025-05-25 14:30:45.761523
CURRENT_DATE: pobieranie aktualnej daty
Funkcja CURRENT_DATE zwraca tylko aktualną datę bez czasu. Typ zwracanej wartości to DATE.
Przykład:
SELECT CURRENT_DATE;
-- Wynik: 2025-05-25
To jest wygodne, jeśli nie musisz brać pod uwagę czasu, np. przy obliczaniu wieku albo grupowaniu danych po dniach.
CURRENT_TIME: pobieranie aktualnego czasu
Funkcja CURRENT_TIME zwraca aktualny czas w formacie TIME WITH TIME ZONE. Jeśli nie potrzebujesz strefy czasowej, możesz przekonwertować wynik na TIME.
Przykład:
SELECT CURRENT_TIME;
-- Wynik: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- Wynik: 14:30:45.761523
Przykłady użycia funkcji
Zobaczmy kilka praktycznych przykładów, gdzie te funkcje mogą się przydać.
Automatyczne ustawianie czasu utworzenia rekordu
Kiedy dodajemy rekordy do tabeli, często warto automatycznie zapisywać datę i czas ich utworzenia. W PostgreSQL można to zrobić, ustawiając DEFAULT NOW() przy tworzeniu tabeli.
Przykład tworzenia tabeli:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- moment utworzenia rekordu
);
Dodanie rekordu:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
Zobaczmy zawartość tabeli:
SELECT * FROM orders;
Wynik:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
Filtrowanie danych po dacie
Załóżmy, że mamy tabelę zamówień i chcemy wybrać wszystkie zamówienia utworzone dzisiaj. Użyjemy funkcji CURRENT_DATE do filtrowania:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
Tutaj używamy konwersji created_at::DATE, żeby odciąć czas i zostawić tylko datę.
Różnice między NOW() a CURRENT_TIMESTAMP
Na pierwszy rzut oka wydaje się, że NOW() i CURRENT_TIMESTAMP robią to samo. I faktycznie tak jest. Po prostu funkcja NOW() pochodzi z jednego standardu, a CURRENT_TIMESTAMP z innego.
NOW() — funkcja PostgreSQL
Funkcja NOW() to wbudowana funkcja PostgreSQL, która zwraca wartość typu TIMESTAMP WITH TIME ZONE (timestamptz). To jest aktualny czas serwera w momencie rozpoczęcia zapytania SQL.
Przykład:
SELECT NOW();
CURRENT_TIMESTAMP — standard SQL
CURRENT_TIMESTAMP to wyrażenie zdefiniowane przez standard SQL i ono też zwraca TIMESTAMP WITH TIME ZONE w PostgreSQL. W praktyce PostgreSQL realizuje CURRENT_TIMESTAMP jako wywołanie tej samej funkcji co NOW().
Przykład:
SELECT CURRENT_TIMESTAMP;
Porównanie w praktyce
SELECT NOW(), CURRENT_TIMESTAMP;
Wynik:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
Obie wartości są identyczne, bo są obliczane w tym samym momencie — na początku zapytania.
Użycie funkcji czasowych w warunkach filtrowania
Spróbujmy teraz napisać zapytanie, które wybiera rekordy utworzone w ciągu ostatnich 7 dni. Do tego można użyć NOW() z operacjami arytmetycznymi na datach:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
Podobnie, jeśli chcesz wybrać zamówienia z bieżącego miesiąca, możesz użyć funkcji DATE_TRUNC(), żeby odciąć początek miesiąca:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC() to ciekawa funkcja, opowiem o niej więcej za parę lekcji :P
Praktyczne tipy
- Używaj
NOW()alboCURRENT_TIMESTAMP, jeśli potrzebujesz dokładnego czasu ze strefą czasową. - Stosuj
CURRENT_DATE, jeśli do twojego zadania wystarczy sama data (np. przy obliczaniu wieku albo analizie zdarzeń z konkretnego dnia). CURRENT_TIMEnajczęściej przydaje się do raportów lub interfejsów, gdzie ważne jest pokazanie, ile czasu zajęło wykonanie zadania.
W następnej lekcji zaczniemy wyciągać części daty i czasu, używając funkcji EXTRACT() i AGE(). Dzięki nim możesz np. łatwo określić wiek osoby albo obrabiać dane po dniach, miesiącach czy latach.
GO TO FULL VERSION