MySQL: Funkcje Daty i Czasu

Witajcie, przyszli programiści baz danych! W tej lekcji nauczymy się, jak efektywnie zarządzać datami i czasami w bazach danych MySQL. To kluczowa umiejętność, ponieważ niemal każda aplikacja przechowuje i przetwarza informacje związane z czasem – od daty urodzenia, przez czas dodania posta, aż po terminy ważności produktów.

Gotowi na podróż w świat funkcji czasowych? Zaczynamy!

1. Typy Danych Daty i Czasu w MySQL

Zanim zaczniemy korzystać z funkcji, musimy wiedzieć, jak przechowywać daty i czasy w tabelach. MySQL oferuje kilka dedykowanych typów danych:

DATE

TIME

DATETIME

TIMESTAMP

YEAR

Przykład tworzenia tabeli z typami daty/czasu:

CREATE TABLE wydarzenia (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(100) NOT NULL,
    data_wydarzenia DATE,
    godzina_rozpoczecia TIME,
    data_i_czas_dodania DATETIME DEFAULT CURRENT_TIMESTAMP,
    ostatnia_aktualizacja TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    rok_wydania YEAR
);

INSERT INTO wydarzenia (nazwa, data_wydarzenia, godzina_rozpoczecia, rok_wydania)
VALUES ('Spotkanie zespołu', '2024-10-26', '14:30:00', 2024);

INSERT INTO wydarzenia (nazwa, data_wydarzenia, godzina_rozpoczecia, rok_wydania)
VALUES ('Prezentacja projektu', '2025-01-15', '10:00:00', 2025);

SELECT * FROM wydarzenia;

2. Podstawowe Funkcje Daty i Czasu

MySQL oferuje wiele funkcji do pracy z datami i czasami. Oto te, które będziesz najczęściej używać:

2.1. Pobieranie bieżącej daty i czasu

Potrzebujesz wiedzieć, "kiedy to jest teraz"? Te funkcje Ci w tym pomogą:

2.2. Formatowanie Daty i Czasu

Często potrzebujesz wyświetlić datę w konkretnym formacie, np. "8 marca 2024" zamiast "2024-03-08". Do tego służą funkcje formatujące!

DATE_FORMAT(data, format)

To Twoja główna funkcja do formatowania dat. Drugi argument to ciąg znaków formatujących.

Przykłady DATE_FORMAT():

-- Wyświetl datę w formacie "Dzień tygodnia, DD Miesiąc YYYY"
SELECT nazwa, DATE_FORMAT(data_wydarzenia, '%W, %d %M %Y') AS sformatowana_data
FROM wydarzenia;

-- Wynik: Spotkanie zespołu | Sobota, 26 Październik 2024

-- Wyświetl datę i godzinę w formacie "DD-MM-YYYY HH:MM AM/PM"
SELECT nazwa, DATE_FORMAT(data_i_czas_dodania, '%d-%m-%Y %h:%i %p') AS sformatowana_data_i_czas
FROM wydarzenia;

TIME_FORMAT(czas, format)

Działa analogicznie do DATE_FORMAT, ale dla wartości czasowych. Używa podobnych specyfikatorów dla godzin, minut i sekund.

Przykład TIME_FORMAT():

SELECT nazwa, TIME_FORMAT(godzina_rozpoczecia, '%H:%i - %r') AS sformatowana_godzina
FROM wydarzenia;
-- Wynik: Spotkanie zespołu | 14:30 - 02:30:00 PM

2.3. Wyodrębnianie Komponentów Daty i Czasu

Potrzebujesz tylko roku? Albo tylko miesiąca? Te funkcje są idealne!

Przykłady wyodrębniania komponentów:

SELECT
    nazwa,
    YEAR(data_wydarzenia) AS rok,
    MONTH(data_wydarzenia) AS miesiac,
    DAY(data_wydarzenia) AS dzien_miesiaca,
    HOUR(godzina_rozpoczecia) AS godzina,
    MINUTE(godzina_rozpoczecia) AS minuta,
    DAYOFWEEK(data_wydarzenia) AS dzien_tygodnia_nr -- 1=Niedziela, 2=Poniedziałek
FROM wydarzenia
WHERE nazwa = 'Spotkanie zespołu';

-- Wynik: Spotkanie zespołu | 2024 | 10 | 26 | 14 | 30 | 7

2.4. Operacje Arytmetyczne na Datach i Czasach (Dodawanie/Odejmowanie)

Chcesz przesunąć datę o tydzień do przodu? Albo dowiedzieć się, co było miesiąc temu? To zadanie dla DATE_ADD() i DATE_SUB().

Dostępne jednostki (jednostka): YEAR, MONTH, DAY, HOUR, MINUTE, SECOND i wiele innych (np. WEEK, QUARTER, YEAR_MONTH).

Przykłady dodawania/odejmowania dat:

SELECT
    nazwa,
    data_wydarzenia,
    DATE_ADD(data_wydarzenia, INTERVAL 7 DAY) AS za_tydzien,
    DATE_SUB(data_wydarzenia, INTERVAL 1 MONTH) AS miesiac_temu,
    ADDDATE(data_wydarzenia, INTERVAL 2 YEAR) AS za_dwa_lata,
    SUBDATE(godzina_rozpoczecia, INTERVAL 30 MINUTE) AS 30_minut_wczesniej
FROM wydarzenia
WHERE nazwa = 'Spotkanie zespołu';

-- Wynik (przykładowo dla Spotkania zespołu):
-- 2024-10-26 | 2024-11-02 | 2024-09-26 | 2026-10-26 | 14:00:00

2.5. Obliczanie Różnicy Między Datami i Czasami

Ile dni minęło od wydarzenia? Ile czasu zostało do rozpoczęcia? Na te pytania odpowiedzą funkcje różnicowe.

Przykłady obliczania różnic:

-- Ile dni minęło od wydarzenia do dziś?
SELECT
    nazwa,
    data_wydarzenia,
    CURDATE() AS dzisiaj,
    DATEDIFF(CURDATE(), data_wydarzenia) AS dni_od_wydarzenia
FROM wydarzenia
WHERE nazwa = 'Spotkanie zespołu';

-- Ile miesięcy zostało do prezentacji projektu?
SELECT
    nazwa,
    data_wydarzenia,
    TIMESTAMPDIFF(MONTH, CURDATE(), data_wydarzenia) AS miesiecy_do_prezentacji
FROM wydarzenia
WHERE nazwa = 'Prezentacja projektu';

-- Jaka jest różnica czasu między dwoma momentami?
SELECT TIMEDIFF('15:00:00', '10:30:00') AS roznica_czasu; -- Wynik: 04:30:00
Wskazówka: Pamiętaj, że kolejność argumentów w DATEDIFF() i TIMESTAMPDIFF() ma znaczenie! DATEDIFF(data1, data2) oblicza data1 - data2.

Ćwiczenia praktyczne dla Ciebie!

Teraz Twoja kolej! Spróbuj wykonać poniższe zadania w swoim kliencie MySQL (np. MySQL Workbench).

Jeśli nie masz tabeli wydarzenia, użyj kodu z początku lekcji, aby ją utworzyć i wstawić dane.

  1. Wyświetl nazwę każdego wydarzenia i datę jego dodania sformatowaną jako "DD.MM.RRRR HH:MM".
  2. Znajdź wszystkie wydarzenia, które odbędą się w bieżącym roku.
  3. Oblicz, ile lat minęło od roku wydania każdego wydarzenia do dnia dzisiejszego.
  4. Dodaj do tabeli nowe wydarzenie o nazwie "Uroczystość szkolna", które odbędzie się za 3 miesiące od dzisiaj, o godzinie 17:00. Pamiętaj, aby rok był poprawny.
  5. Wyświetl nazwy wydarzeń oraz informację, ile dni pozostało do ich rozpoczęcia (jeśli wydarzenie już minęło, pokaż ujemną liczbę dni).
  6. Wyświetl nazwy wydarzeń i datę ich ostatniej aktualizacji, sformatowaną jako "YYYY-MM-DD (dzień tygodnia)".

Pamiętaj, praktyka czyni mistrza! Im więcej będziesz eksperymentować z tymi funkcjami, tym lepiej je zrozumiesz i będziesz umiał wykorzystywać w swoich projektach.

Powodzenia!