Jak często spotykasz aplikacje, które pracują z datami i czasem? Zamówienia online, rozkłady, historia zmian w bazie danych — wszystko to zależy od poprawnego przechowywania czasu. PostgreSQL daje mega narzędzia do pracy z takimi danymi i oczywiście tabele z czasem to nie są straszne tabelki z zegarkami, tylko konkretna struktura, która pozwala analizować i porządkować zdarzenia.
Typy do daty i czasu pozwalają na:
- Przechowywanie tylko daty
DATE, tylko czasuTIMEalbo obu narazTIMESTAMP. - Robienie operacji, takich jak dodawanie dni, liczenie różnicy między datami i filtrowanie rekordów po kryteriach czasowych.
- Obsługę stref czasowych (ale to temat na przyszłe wykłady).
Typy danych: DATE, TIME, TIMESTAMP
Typ danych DATE
Typ DATE jest do przechowywania tylko daty, bez czasu. Zapisuje rok, miesiąc i dzień. Ten typ jest spoko, gdy:
- Trzeba zapisać datę urodzin użytkownika.
- Data zdarzenia jest ważna, ale godzina już nie.
Przykładowy format: YYYY-MM-DD (rok-miesiąc-dzień).
Przykład:
| id | name - VARCHAR(100) | event_date - DATE |
|---|---|---|
| 1 | SQL Workshop | 2025-06-15 |
| 2 | Python | 2025-06-17 |
| 3 | Java Courses | 2025-06-25 |
Typ danych TIME
Typ TIME jest do przechowywania tylko czasu. Przydaje się, gdy:
- Trzeba zapisać rozkład, np. początek dnia pracy.
- Czas ma znaczenie, ale data już nie.
Przykładowy format: HH:MI:SS (godziny:minuty:sekundy).
Przykład:
| id | task_name - VARCHAR(100) | start_time - TIME |
|---|---|---|
| 1 | Team Meeting | 09:00:00 |
| 2 | Code Review | 11:30:00 |
| 3 | Client Call | 15:00:00 |
Typ danych TIMESTAMP
TIMESTAMP — to połączenie daty i czasu. Przydaje się, gdy:
- Trzeba zapisać moment, np. kiedy użytkownik się zalogował.
- Potrzebny jest znacznik czasu do śledzenia zmian (logowanie).
Przykładowy format: YYYY-MM-DD HH:MI:SS (rok-miesiąc-dzień godziny:minuty:sekundy).
Przykład:
| id | action - VARCHAR(100) | login_time - TIMESTAMP |
|---|---|---|
| 1 | User Login | 2023-10-15 14:30:00 |
| 2 | File Uploaded | 2023-10-15 15:10:00 |
| 3 | User Logout | 2023-10-15 16:45:00 |
Operacje na dacie i czasie
Teraz, gdy już wiemy jakie są typy, zobaczmy jak z nich korzystać. PostgreSQL ma mnóstwo wbudowanych funkcji do operacji na datach i czasie.
Wyciąganie części daty i czasu
Jeśli masz znacznik czasu (TIMESTAMP) i chcesz wyciągnąć tylko rok, miesiąc, dzień albo godzinę, użyj funkcji EXTRACT.
Przykład:
SELECT EXTRACT(YEAR FROM TIMESTAMP '2025-06-15 14:30:00') AS rok;
-- Wynik: 2025
SELECT EXTRACT(MONTH FROM TIMESTAMP '2025-06-15 14:30:00') AS miesiac;
-- Wynik: 06
SELECT EXTRACT(DAY FROM TIMESTAMP '2025-06-15 14:30:00') AS dzien;
-- Wynik: 15
Dodawanie i odejmowanie przedziałów czasowych
Chcesz wiedzieć, co będzie za tydzień? Albo co było wczoraj? Skorzystaj z operacji na przedziałach czasowych.
Przykład:
-- Dodanie 7 dni do bieżącej daty
SELECT CURRENT_DATE + INTERVAL '7 days' AS nastepny_tydzien;
-- Odjęcie 1 miesiąca
SELECT CURRENT_DATE - INTERVAL '1 month' AS poprzedni_miesiac;
Porównywanie dat
Jak sprawdzić, czy wydarzenie już było? Prościej niż znaleźć buga w kodzie — po prostu porównaj wartości.
Przykład:
SELECT event_date
FROM events
WHERE event_date < CURRENT_DATE;
-- Wybieramy wszystkie wydarzenia z przeszłości
Więcej o funkcjach do pracy z czasem i datą dowiesz się na kolejnych wykładach. Na razie po prostu zapamiętaj, że takie typy istnieją — to wystarczy.
Problemy stref czasowych i standard czasu
Chociaż w tym wykładzie jeszcze nie będziemy wchodzić w szczegóły stref czasowych, warto wspomnieć, że PostgreSQL obsługuje typ TIMESTAMPTZ (znacznik czasu ze strefą czasową). Na przykład, 2023-10-15 14:30:00+02 pokazuje, że ten czas jest w strefie UTC+2.
Na pewno omówimy ten temat na naszym kursie, tylko trochę później :P
Przykład
Teraz czas sprawdzić w praktyce nasze świeżo zdobyte skille. Stwórzmy tabelę, która będzie przechowywać rozkład zajęć studentów.
| id | subject_name | class_date - DATE | start_time - TIME | end_time - TIME | created_at - TIMESTAMP |
|---|---|---|---|---|---|
| 1 | Mathematics | 2023-10-16 | 09:00:00 | 10:30:00 | 2023-10-12 14:00:00 |
| 2 | Physics | 2023-10-16 | 11:00:00 | 12:30:00 | 2023-10-12 14:00:00 |
| 3 | Chemistry | 2023-10-17 | 09:00:00 | 10:30:00 | 2023-10-12 14:01:00 |
| 4 | Literature | 2023-10-17 | 11:00:00 | 12:30:00 | 2023-10-12 14:01:00 |
| 5 | Computer Science | 2023-10-18 | 10:00:00 | 11:30:00 | 2023-10-12 14:02:00 |
Za kilka wykładów będziesz tworzyć takie tabele w bazie za pomocą zapytań SQL. Na razie po prostu podziwiamy :)
Typowe błędy
Format daty i czasu: przy wstawianiu danych ważne jest trzymanie się poprawnego formatu: YYYY-MM-DD dla dat i HH:MI:SS dla czasu. PostgreSQL może się pogubić, jeśli spróbujesz wstawić datę jako "15/10/2023".
Niezgodność typów danych: próba zapisania wartości tekstowej do pola typu DATE skończy się błędem.
Błędy przedziałów czasowych: jeśli dodasz np. 30 dni do lutego, PostgreSQL ogarnie to poprawnie, ale data może już być w marcu.
Teraz już znasz typy danych do pracy z datą i czasem w PostgreSQL. W prawdziwych projektach to pomaga ogarniać rozkłady, logować zdarzenia albo śledzić ważne akcje w systemie!
GO TO FULL VERSION