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!
Zanim zaczniemy korzystać z funkcji, musimy wiedzieć, jak przechowywać daty i czasy w tabelach. MySQL oferuje kilka dedykowanych typów danych:
DATE'YYYY-MM-DD'.'2024-10-26'TIME'HH:MM:SS'.'14:30:00'DATETIME'YYYY-MM-DD HH:MM:SS'.'2024-10-26 14:30:00'TIMESTAMPDATETIME, przechowuje datę i czas ('YYYY-MM-DD HH:MM:SS').TIMESTAMP jest przechowywany w UTC (Uniwersalny Czas Koordynowany) i konwertowany na lokalną strefę czasową serwera przy pobieraniu/wstawianiu danych. Może też automatycznie aktualizować się przy modyfikacji rekordu.YEAR2024, 99 (co może oznaczać 1999 lub 2099 w zależności od kontekstu).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;
MySQL oferuje wiele funkcji do pracy z datami i czasami. Oto te, które będziesz najczęściej używać:
Potrzebujesz wiedzieć, "kiedy to jest teraz"? Te funkcje Ci w tym pomogą:
NOW(): Zwraca bieżącą datę i czas jako wartość DATETIME.
SELECT NOW();
-- Wynik: 2024-03-08 11:45:30 (przykładowo)
CURDATE(): Zwraca tylko bieżącą datę jako wartość DATE.
SELECT CURDATE();
-- Wynik: 2024-03-08 (przykładowo)
CURTIME(): Zwraca tylko bieżący czas jako wartość TIME.
SELECT CURTIME();
-- Wynik: 11:45:30 (przykładowo)
SYSDATE(): Podobnie jak NOW(), ale zwraca czas, kiedy funkcja została faktycznie wykonana, co może być nieco inne w specyficznych scenariuszach replikacji. Dla większości zastosowań używaj NOW().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.
%Y: Rok (4 cyfry, np. 2024)%y: Rok (2 cyfry, np. 24)%m: Miesiąc (01-12)%M: Pełna nazwa miesiąca (np. March)%b: Skrócona nazwa miesiąca (np. Mar)%d: Dzień miesiąca (01-31)%e: Dzień miesiąca (0-31, bez wiodącego zera)%W: Pełna nazwa dnia tygodnia (np. Friday)%a: Skrócona nazwa dnia tygodnia (np. Fri)%H: Godzina (00-23)%h: Godzina (01-12)%i: Minuty (00-59)%s: Sekundy (00-59)%p: AM lub PMDATE_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.
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
Potrzebujesz tylko roku? Albo tylko miesiąca? Te funkcje są idealne!
YEAR(data): Zwraca rok z daty.MONTH(data): Zwraca miesiąc z daty (jako liczbę 1-12).DAY(data): Zwraca dzień miesiąca z daty.HOUR(czas): Zwraca godzinę z czasu.MINUTE(czas): Zwraca minuty z czasu.SECOND(czas): Zwraca sekundy z czasu.WEEK(data), DAYOFWEEK(data) (dzień tygodnia, niedziela=1), DAYOFYEAR(data) (dzień w roku, 1-366).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
Chcesz przesunąć datę o tydzień do przodu? Albo dowiedzieć się, co było miesiąc temu? To zadanie dla DATE_ADD() i DATE_SUB().
DATE_ADD(data, INTERVAL wartość jednostka): Dodaje określony interwał do daty.DATE_SUB(data, INTERVAL wartość jednostka): Odejmuje określony interwał od daty.ADDDATE() dla DATE_ADD() oraz SUBDATE() dla DATE_SUB().Dostępne jednostki (jednostka): YEAR, MONTH, DAY, HOUR, MINUTE, SECOND i wiele innych (np. WEEK, QUARTER, YEAR_MONTH).
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
Ile dni minęło od wydarzenia? Ile czasu zostało do rozpoczęcia? Na te pytania odpowiedzą funkcje różnicowe.
DATEDIFF(data1, data2): Zwraca różnicę w dniach między data1 a data2 (data1 - data2).TIMEDIFF(czas1, czas2): Zwraca różnicę w czasie między czas1 a czas2.TIMESTAMPDIFF(jednostka, data_start, data_koniec): Bardzo elastyczna funkcja! Zwraca różnicę między dwiema datami/czasami w określonej jednostce.Przykładowe jednostki dla TIMESTAMPDIFF: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND.
-- 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
DATEDIFF() i TIMESTAMPDIFF() ma znaczenie! DATEDIFF(data1, data2) oblicza data1 - data2.
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.
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!