Wróć do Bloga
3 min read

Jak obliczyć wiek w SQL (PostgreSQL, MySQL, SQL Server)

Poznaj praktyczne wzorce SQL do obliczania wieku na podstawie daty urodzenia: ukończone lata, dokładne lata i miesiące oraz wiek na określoną datę. Zawiera przykłady PostgreSQL, MySQL i SQL Server.

Jak obliczyć wiek w SQL (PostgreSQL, MySQL, SQL Server)

Chcesz obliczyć wiek w SQL na podstawie daty urodzenia? W tym przewodniku przedstawiono praktyczne, gotowe do kopiowania zapytania do popularnych baz danych. Dowiesz się, jak obliczyć:

  • Wiek w latach (ukończone lata)
  • Wiek na określoną datę (nie tylko dzisiaj)
  • Dokładny wynik w stylu (lata i miesiące), gdy potrzebujesz więcej szczegółów

1) Zdecyduj, co „wiek” oznacza w Twoim przypadku użycia

Większość logiki biznesowej wykorzystuje ukończone lata. Oznacza to, że osoba urodzona 10.06.2000 r. będzie miała 25 lat 10.06.2026 r., a nie wcześniej. Zachowaj ostrożność przy prostym odejmowaniu roku, np. ROK(dzisiaj) - ROK(dob), ponieważ przed urodzinami jest to błędne.[[TAG_19]]]

2) PostgreSQL: wiek w latach (ukończone lata)

PostgreSQL ma wbudowaną funkcję age(), która zwraca interwał. Wyodrębnij pełne lata w ten sposób:

WYBIERZ WYCIĄG(ROK Z wieku(CURRENT_DATE, data ur.)) AS wiek_lat
OD osób;

PostgreSQL: wiek na określoną datę

WYBIERZ WYCIĄG(ROK Z wieku(DATA '2026-02-23', data ur.)) AS wiek_lat
OD osób;

3) MySQL: wiek w latach (ukończone lata)

W MySQL użyj TIMESTAMPDIFF:

WYBIERZ TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS wiek_lat
OD osób;

MySQL: wiek na określoną datę

WYBIERZ ZNACZNIK CZASOWYDIFF(ROK, data urodzenia, DATA('2026-02-23')) AS wiek_lata
OD osób;

4) SQL Server: wiek w latach (ukończone lata)

Typowy wzorzec w SQL Server to DATEDIFF minus czek urodzinowy:

WYBIERZ
  DATEDIFF(ROK, data data, RADOWANIE(GETDATE() JAKO data))
  - SPRAWA
      WHEN DATEADD(ROK, DATEDIFF(ROK, dob, CAST(GETDATE() AS data)), dob) > CAST(GETDATE() AS data)
      WTEDY 1 INNE 0
    END AS wiek_lat
OD osób;

SQL Server: wiek na określoną datę

OŚWIADCZ @as_of date = '23.02.2026';
WYBIERZ
  DATEDIFF(ROK, data urodzenia, @as_of)
  - SPRAWA
      KIEDY DATEADD(ROK, DATEDIFF(ROK, data_data, @as_of), data_dob) > @as_of
      WTEDY 1 INNE 0
    END AS wiek_lat
OD osób;

5) Dokładny wiek (lata i miesiące) – przykład

Jeśli chcesz uzyskać „dokładną” prezentację, np. „31 lat i 4 miesiące”, oblicz najpierw lata, a następnie miesiące po ostatnich urodzinach. Oto jeden przykład PostgreSQL:

Z bazowym AS (
  WYBIERZ dane, CURRENT_DATE AS as_of
  OD ludzi
)
WYBIERZ
  WYCIĄG(ROK Z wieku (od, data urodzenia)) AS lat,
  WYCIĄG(MIESIĄC OD wieku (od, data urodzenia)) JAKO miesiące
Z bazy;

Typowe pułapki

  • Strefy czasowe: jeśli to możliwe, przechowuj datę DOB jako datę. Daty i godziny mogą zmieniać się w różnych strefach.
  • Urodziny w dzień przestępny: określ, co dzieje się w latach innych niż przestępne. Większość systemów traktuje urodziny 2004-02-29 jako 28.02 lub 01.03, w zależności od zasad.
  • Null lub przyszły DOB: filtr lub ochrona, w przeciwnym razieTwoje zapytanie zwróci wartości null lub wartości ujemne.

Szybka kontrola poprawności

Jeśli chcesz szybko zweryfikować pojedynczy DOB, możesz skorzystać z kalkulatora online: Oblicz wiek online.

Powiązane przewodniki

Często zadawane pytania

Dlaczego ROK(dzisiaj) minus ROK(dob) jest błędny?

Ignoruje, czy urodziny miały już miejsce w tym roku, więc zawyża wiek przed urodzinami.

Jaki jest najbezpieczniejszy typ SQL dla daty urodzenia?

Użyj kolumny data (a nie datetime) dla DOB, jeśli zależy ci tylko na dniu kalendarzowym.