Data: 10.01.2023

MS SQL Server funkcje daty i czasu
Spis treści
W artykule przedstawiam najczęściej używane funkcje daty i czasu dla bazy danych MS SQL Server. Funkcje daty i czasu służą do wykonywania operacji na datach i godzinach.
Przykłady i zadania prezentowane w artykule możesz uruchomić w bazach AdventureWorks lub Northwind.
Dostępność funkcji zależy od wersji SQL Server, którą masz zainstalowaną. Jeśli nie możesz jakiejś funkcji znaleźć, sprawdź czy dla używanej przez Ciebie wersji funkcja jest dostępna.
MS SQL Server funkcje daty i czasu – sposób zapisu daty
W SQL Server mamy do dyspozycji kilka typów danych reprezentujących datę i czas. Informacje o typach danych znajdziesz w naszym artykule Typy danych w SQL Server
Daty zapisujemy w SQL Server w apostrofach. Możemy zapisywać je w formacie z separatorami lub ciągłym tekstem. Neutralny językowo format daty i czasu to zapis bez separatorów np. '20210218′ (’yyyyMMdd’).
Dla nowszego typu danych DATE (wprowadzonego w SQL Server 2008), format z myślnikami 'yyyy-MM-dd’ również jest bezpieczny (interpretowany jako niezależny od języka). Format bez separatorów jest zawsze bezpieczny niezależnie od wersji SQL Server.
Poniżej znajdziesz informacje na temat funkcji, które pozwalają wykonywać operacje na datach w środowisku SQL Server.
Funkcja DATEDIFF()
Funkcja DATEDIFF() zwraca różnicę pomiędzy dwiema datami. W wyniku otrzymujemy liczbę całkowitą (typ integer).
Składnia funkcji:
DATEDIFF(interval, starting_date datetime, endingdate datetime) RETURNS int
Argumenty funkcji:
interval – w argumencie interwał podajemy jednostki, w których ma być policzona różnica pomiędzy datami. Możemy podać następujące wartości:
- year, yyyy, yy
- quarter, qq, q
- month, mm, m
- dayofyear
- day, dy, y
- week, ww, wk
- weekday, dw, w
- hour, hh
- minute, mi, n
- second, ss, s
- millisecond, ms
starting_date datetime – podajemy datę początkową
ending_date datetime – podajemy datę końcową
W MS SQL Server funkcja DATEDIFF() liczy przekroczone granice danego interwału, a nie dokładny czas. Przykładowo dla interwału YEAR zwróci wynik 1 już przy przejściu z 31 grudnia na 1 stycznia – liczy jedynie zmianę numeru roku w kalendarzu, a nie faktyczny upływ 365 dni.
SELECT DATEDIFF(YEAR,'20241231','20250101')--wynik 1W przykładzie poniżej wyliczamy, ile dni upłynęło od daty złożenia zamówienia (OrderDate) do daty wysyłki (ShippedDate).
USE Northwind;SELECT OrderID, OrderDate, ShippedDate,DATEDIFF(DAY,OrderDate, ShippedDate) as DniWysylkaFROM Orders;Wyliczony wynik znajduje się w kolumnie DniWysylka.
| OrderID | OrderDate | ShippedDate | DniWysylka |
|---|---|---|---|
| 10248 | 1996-07-04 00:00:00.000 | 1996-07-16 00:00:00.000 | 12 |
| 10249 | 1996-07-05 00:00:00.000 | 1996-07-10 00:00:00.000 | 5 |
| 10250 | 1996-07-08 00:00:00.000 | 1996-07-12 00:00:00.000 | 4 |
| 10251 | 1996-07-08 00:00:00.000 | 1996-07-15 00:00:00.000 | 7 |
| 10252 | 1996-07-09 00:00:00.000 | 1996-07-11 00:00:00.000 | 2 |
| 10253 | 1996-07-10 00:00:00.000 | 1996-07-16 00:00:00.000 | 6 |
W przykładzie poniżej sprawdzamy, czy skończymy produkcję poszczególnych towarów na 7 dni lub później niż data wymagalności:
- wybieramy kolumny ID produktu (ProductID), Data końca produkcji (EndDate), Data wymagalności (DueDate)
- wyliczamy w dniach różnicę pomiędzy Datą końca produkcji a Datą wymagalności
- wybieramy tylko te rekordy, w przypadku których produkcja zostanie zakończona 7 lub więcej dni po dacie wymagalności
USE AdventureWorks2017;SELECT ProductID, EndDate, DueDate,DATEDIFF(DAY,DueDate, EndDate) as IloscDniFROM Production.WorkOrderWHERE DATEDIFF(DAY,DueDate, EndDate) >= 7Wynik zapytania:
| ProductID | EndDate | DueDate | IloscDni |
|---|---|---|---|
| 749 | 2011-06-27 00:00:00.000 | 2011-06-18 00:00:00.000 | 9 |
| 750 | 2011-06-27 00:00:00.000 | 2011-06-18 00:00:00.000 | 9 |
| 753 | 2011-06-27 00:00:00.000 | 2011-06-18 00:00:00.000 | 9 |
| 767 | 2011-06-27 00:00:00.000 | 2011-06-18 00:00:00.000 | 9 |
Funkcja DATEADD()
Funkcja DATEADD() umożliwia dodawanie do określonej daty wskazanej liczby jednostek np. do daty 2021-08-17 dodajemy 2 dni i otrzymujemy datę 2021-08-19.
Składnia funkcji:
DATEADD(interval, increment, expression)
Argumenty funkcji:
interval – podajemy jednostki, które mają być dodane do daty. Możemy podać następujące wartości:
- year, yyyy, yy
- quarter, qq, q
- month, mm, m
- dayofyear, dy, y
- day, dd, d
- week, ww, wk
- weekday, dw, w
- hour, hh
- minute, mi, n
- second, ss, s
- millisecond, ms
increment – liczba interwałów do dodania do daty np. liczba miesięcy. Wymagany typ danych to liczba całkowita. Jeśli podamy liczbę dodatnią, otrzymamy daty w przyszłości. Jeśli podamy liczbę ujemną otrzymamy daty z przeszłości.
expression – podajemy datę, do której chcemy dodać określoną ilość interwałów.
W przykładzie poniżej chcemy ustalić, jaka będzie data za 90 dni.
- wybieramy kolumnę ModifiedDate
- za pomocą funkcji DATEADD() zwracamy datę z kolumny ModifiedDate powiększoną o 90 dni. Zwróconą datę wyświetlamy w nowej kolumnie o nazwie DataZmHasla.
USE AdventureWorks2017;SELECT LoginID, ModifiedDate,DATEADD(DAY,90,ModifiedDate) as DataZmHaslaFROM HumanResources.Employee;Wynik:
| LoginID | ModifiedDate | DataZmHasla |
|---|---|---|
| adventure-works\ken0 | 2014-06-30 00:00:00.000 | 2014-09-28 00:00:00.000 |
| adventure-works\terri0 | 2014-06-30 00:00:00.000 | 2014-09-28 00:00:00.000 |
| adventure-works\roberto0 | 2014-06-30 00:00:00.000 | 2014-09-28 00:00:00.000 |
| adventure-works\rob0 | 2014-06-30 00:00:00.000 | 2014-09-28 00:00:00.000 |
| adventure-works\gail0 | 2014-06-30 00:00:00.000 | 2014-09-28 00:00:00.000 |
W przykładzie poniżej mamy dwie funkcje zwracające godzinę powiększoną o 10 minut (kolumna Minuty) oraz godzinę powiększoną o 10 sekund (kolumna Sekundy).
USE AdventureWorks2017;SELECT ModifiedDate,DATEADD(MINUTE,10,ModifiedDate) as Minuty,DATEADD(SECOND,10,ModifiedDate) as SekundyFROM Person.Person;Wynik:
| ModifiedDate | Minuty | Sekundy |
|---|---|---|
| 2009-01-07 00:00:00.000 | 2009-01-07 00:10:00.000 | 2009-01-07 00:00:10.000 |
| 2008-01-24 00:00:00.000 | 2008-01-24 00:10:00.000 | 2008-01-24 00:00:10.000 |
| 2007-11-04 00:00:00.000 | 2007-11-04 00:10:00.000 | 2007-11-04 00:00:10.000 |
| 2007-11-28 00:00:00.000 | 2007-11-28 00:10:00.000 | 2007-11-28 00:00:10.000 |
| 2007-12-30 00:00:00.000 | 2007-12-30 00:10:00.000 | 2007-12-30 00:00:10.000 |
Funkcja DAY()
Funkcja DAY() zwraca numer dnia z podanej daty. Przykładowo dla daty 2022-12-01 zwróci jedynkę.
Składnia funkcji:
DAY(expression)
W miejsce expression podajemy datę.
W przykładzie poniżej:
- z tabeli Production.WorkOrder w bazie danych AdventureWorks odczytujemy kolumny ProductID i EndDate
- funkcją DAY() odczytujemy z daty w kolumnie EndDate dzień
- funkcją MONTH() odczytujemy z daty w kolumnie EndDate miesiąc
- funkcją YEAR() odczytujemy z daty w kolumnie EndDate rok
- za pomocą klauzuli WHERE wybieramy tylko te rekordy, w których EndDate przypada na pierwszy dzień maja.
Use AdventureWorks2017;SELECT ProductID, EndDate,DAY(EndDate) as dzien,MONTH(EndDate) miesiac,YEAR(EndDate) as rokFROM Production.WorkOrderWHERE DAY(EndDate) = 1AND MONTH(EndDate) = 5;Wynik:
| ProductID | EndDate | dzien | miesiac | rok |
|---|---|---|---|---|
| 749 | 2012-05-01 00:00:00.000 | 1 | 5 | 2012 |
| 750 | 2012-05-01 00:00:00.000 | 1 | 5 | 2012 |
| 751 | 2012-05-01 00:00:00.000 | 1 | 5 | 2012 |
Funkcja MONTH()
Funkcja MONTH() zwraca numer miesiąca z określonej daty np. dla maja otrzymamy w wyniku cyfrę 5.
Składnia funkcji:
MONTH(expression)
W przykładzie poniżej z tabeli Employees w bazie Northwind wybieramy tylko te rekordy, w których data zatrudnienia pracownika przypada na styczeń.
USE Northwind;SELECT FirstName, LastName, HireDate,MONTH(HireDate) as miesiacFROM EmployeesWHERE MONTH(HireDate) = 1;Wynik:
| FirstName | LastName | HireDate | miesiac |
|---|---|---|---|
| Robert | King | 1994-01-02 00:00:00.000 | 1 |
Funkcja YEAR()
Funkcja YEAR() zwraca rok z określonej daty.
Składnia funkcji:
YEAR(expression)
W przykładzie poniżej z tabeli Employees w bazie Northwind wybieramy tylko tych pracowników, którzy zatrudnieni zostali w 1993 roku.
USE Northwind;SELECT FirstName, LastName, HireDate, YEAR(HireDate) as year_hire_dateFROM EmployeesWHERE YEAR(HireDate) = 1993;Wynik:
| FirstName | LastName | HireDate | year_hire_date |
|---|---|---|---|
| Margaret | Peacock | 1993-05-03 00:00:00.000 | 1993 |
| Steven | Buchanan | 1993-10-17 00:00:00.000 | 1993 |
| Michael | Suyama | 1993-10-17 00:00:00.000 | 1993 |
Funkcja DATENAME()
Funkcja DATENAME() zwraca ciąg znaków reprezentujący określoną część daty np. nazwę dnia tygodnia.
Składnia funkcji:
DATENAME(datepart, date)
Argumenty funkcji:
Datepart – część daty, która ma zostać zwrócona w wyniku działania funkcji. Możemy podać tutaj następujące argumenty:
- year, yyyy, yy
- quarter, qq, q
- month, mm, m
- dayofyear, dy, y
- day, dd, d
- week, wk, ww
- weekday, dw, w
- hour, hh
- minute, mi, n
- second, ss, s
- millisecond, ms
Funkcja DATENAME() zwraca nazwy np. miesięcy lub dni tygodnia w języku, który jest aktualnie ustawiony dla sesji serwera SQL.
W przykładzie poniżej za pomocą funkcji DATENAME() wyświetlamy miesiąc oraz dzień słownie i wybieramy tylko te rekordy, dla których data startu jest dowolnym piątkiem w czerwcu.
Use AdventureWorks2017;SELECT ProductID, StartDate,DATENAME(MONTH,StartDate) as Miesiac,DATENAME(WEEKDAY,StartDate) as DzienFROM Production.WorkOrderWHERE DATENAME(MONTH,StartDate) = 'June'AND DATENAME(WEEKDAY,StartDate) = 'Friday';Wynik:
| ProductID | StartDate | Miesiac | Dzien |
|---|---|---|---|
| 350 | 2013-06-07 00:00:00.000 | June | Friday |
| 531 | 2013-06-07 00:00:00.000 | June | Friday |
| 779 | 2013-06-14 00:00:00.000 | June | Friday |
| 780 | 2013-06-14 00:00:00.000 | June | Friday |
Funkcja DATEPART()
Zwraca liczbę całkowitą reprezentującą określoną część daty.
Składnia funkcji:
DATEPART (datepart, date)
Argumenty funkcji:
Datepart – część daty, która ma zostać zwrócona. Możemy podać tutaj następujące argumenty:
- year, yyyy, yy
- quarter, qq, q
- month, mm, m
- dayofyear, dy, y
- day, dd, d
- week, ww, wk
- weekday, dw, w
- hour, hh
- minute, mi, n
- second, ss, s
- millisecond, ms
- microsecond, mcs
- nanosecond, ns
- tzoffset, tz (Timezone offset)
- iso_week, isowk, isoww
W przykładzie poniżej za pomocą funkcji DATEPART() zwracamy dla daty kwartał.
Use AdventureWorks2017;SELECT ProductID, StartDate,DATEPART(QUARTER,StartDate) as KwartalFROM Production.WorkOrder;Wynik:
| ProductID | StartDate | Kwartal |
|---|---|---|
| 350 | 2011-07-25 00:00:00.000 | 3 |
| 531 | 2011-07-25 00:00:00.000 | 3 |
| 749 | 2011-07-26 00:00:00.000 | 3 |
| 751 | 2011-07-26 00:00:00.000 | 3 |
Funkcja DATEFROMPARTS()
Funkcja DATEFROMPARTS() została wprowadzona w wersji SQL Server 2012. Akceptuje ona dane wejściowe reprezentujące części daty (rok, miesiąc, dzień) i na podstawie tych części konstruuje datę.
Składnia funkcji:
DATEFROMPARTS(year, month, day)
W przykładzie za pomocą funkcji DATEFROMPARTS() tworzymy datę z kolumny data wymagalności (DueDate) i zmieniamy rok na 2018.
USE AdventureWorks2017SELECT DueDate,DATEFROMPARTS(2018, MONTH(DueDate), DAY(DueDate))as ZmienionaDataFROM [Purchasing].[PurchaseOrderDetail];Wynik:
| DueDate | ZmienionaData |
|---|---|
| 2011-04-30 00:00:00.000 | 2018-04-30 |
| 2011-04-30 00:00:00.000 | 2018-04-30 |
| 2011-05-14 00:00:00.000 | 2018-05-14 |
| 2011-05-14 00:00:00.000 | 2018-05-14 |
Funkcja EOMONTH()
Zwraca ostatni dzień miesiąca zawierającego określoną datę z opcjonalnym przesunięciem.
Składnia funkcji:
EOMONTH (start_date, [month_to_add]) RETURNS Date
Argumenty funkcji:
start_date – data, dla której ma zostać zwrócony ostatni dzień miesiąca
month_to_add – argument opcjonalny, liczba całkowita, który określa liczbę miesięcy do dodania do argumentu start_date.
W przykładzie wyświetlamy wszystkie zamówienia, które zostały złożone 31 sierpnia 1996 roku.
USE Northwind;SELECT CustomerID, OrderID, OrderDate,EOMONTH(OrderDate) as OstDzienMiesiacaFROM OrdersWHERE EOMONTH(OrderDate) = '19960831';Wynik:
| CustomerID | OrderID | OrderDate | OstDzienMiesiaca |
|---|---|---|---|
| WARTH | 10270 | 1996-08-01 00:00:00.000 | 1996-08-31 |
| SPLIR | 10271 | 1996-08-01 00:00:00.000 | 1996-08-31 |
| RATTC | 10272 | 1996-08-02 00:00:00.000 | 1996-08-31 |
| QUICK | 10273 | 1996-08-05 00:00:00.000 | 1996-08-31 |
Funkcja ISDATE()
Określa, czy wyrażenie wejściowe datetime lub smalldatetime ma prawidłową wartość daty lub godziny.
Składnia funkcji:
ISDATE (expression) RETURNS int
Argumenty funkcji:
expression – wyrażenie, które sprawdzamy
W przykładzie za pomocą funkcji ISDATE() sprawdzamy, czy wartości w kolumnie OrderDate są datą. Dla każdego rekordu, w którym jest data w wyniku sprawdzenia otrzymamy jedynkę. Dla rekordów, w których jest inna wartość niż data otrzymamy zero.
USE Northwind;SELECT CustomerID, OrderID, OrderDate,ISDATE(OrderDate) as sprdataFROM Orders;Wynik:
| CustomerID | OrderID | OrderDate | sprdata |
|---|---|---|---|
| VINET | 10248 | 1996-07-04 00:00:00.000 | 1 |
| TOMSP | 10249 | 1996-07-05 00:00:00.000 | 1 |
| HANAR | 10250 | 1996-07-08 00:00:00.000 | 1 |
funkcja GETDATE() – zwrócenie bieżącej daty i czasu
SELECT GETDATE();Informacje na temat funkcji daty i czasu w PL/SQL Oracle znajdziesz w artykule PL/SQL Oracle funkcje daty i czasu.
