CodeGym /Kursy /SQL SELF /Funkcje do pobierania aktualnej daty i czasu: NOW(), CU...

Funkcje do pobierania aktualnej daty i czasu: NOW(), CURRENT_DATE, CURRENT_TIME

SQL SELF
Poziom 31, Lekcja 1
Dostępny

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() albo CURRENT_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_TIME najczęś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.

2
Zadanie
SQL SELF, poziom 31, lekcja 1
Niedostępne
Pobieranie bieżącej daty
Pobieranie bieżącej daty
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION