Data: 10.01.2023

Funkcje daty i czasu w MS SQL Server

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 1

W 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 DniWysylka
FROM Orders;

Wyliczony wynik znajduje się w kolumnie DniWysylka.

OrderIDOrderDateShippedDateDniWysylka
102481996-07-04 00:00:00.0001996-07-16 00:00:00.00012
102491996-07-05 00:00:00.0001996-07-10 00:00:00.0005
102501996-07-08 00:00:00.0001996-07-12 00:00:00.0004
102511996-07-08 00:00:00.0001996-07-15 00:00:00.0007
102521996-07-09 00:00:00.0001996-07-11 00:00:00.0002
102531996-07-10 00:00:00.0001996-07-16 00:00:00.0006

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 IloscDni
FROM Production.WorkOrder
WHERE DATEDIFF(DAY,DueDate, EndDate) >= 7

Wynik zapytania:

ProductIDEndDateDueDateIloscDni
7492011-06-27 00:00:00.0002011-06-18 00:00:00.0009
7502011-06-27 00:00:00.0002011-06-18 00:00:00.0009
7532011-06-27 00:00:00.0002011-06-18 00:00:00.0009
7672011-06-27 00:00:00.0002011-06-18 00:00:00.0009

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 DataZmHasla
FROM HumanResources.Employee;

Wynik:

LoginIDModifiedDateDataZmHasla
adventure-works\ken02014-06-30 00:00:00.0002014-09-28 00:00:00.000
adventure-works\terri02014-06-30 00:00:00.0002014-09-28 00:00:00.000
adventure-works\roberto02014-06-30 00:00:00.0002014-09-28 00:00:00.000
adventure-works\rob02014-06-30 00:00:00.0002014-09-28 00:00:00.000
adventure-works\gail02014-06-30 00:00:00.0002014-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 Sekundy
FROM Person.Person;

Wynik:

ModifiedDateMinutySekundy
2009-01-07 00:00:00.0002009-01-07 00:10:00.0002009-01-07 00:00:10.000
2008-01-24 00:00:00.0002008-01-24 00:10:00.0002008-01-24 00:00:10.000
2007-11-04 00:00:00.0002007-11-04 00:10:00.0002007-11-04 00:00:10.000
2007-11-28 00:00:00.0002007-11-28 00:10:00.0002007-11-28 00:00:10.000
2007-12-30 00:00:00.0002007-12-30 00:10:00.0002007-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 rok
FROM Production.WorkOrder
WHERE DAY(EndDate) = 1
AND MONTH(EndDate) = 5;

Wynik:

ProductIDEndDatedzienmiesiacrok
7492012-05-01 00:00:00.000152012
7502012-05-01 00:00:00.000152012
7512012-05-01 00:00:00.000152012

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 miesiac
FROM Employees
WHERE MONTH(HireDate) = 1;

Wynik:

FirstNameLastNameHireDatemiesiac
RobertKing1994-01-02 00:00:00.0001

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_date
FROM Employees
WHERE YEAR(HireDate) = 1993;

Wynik:

FirstNameLastNameHireDateyear_hire_date
MargaretPeacock1993-05-03 00:00:00.0001993
StevenBuchanan1993-10-17 00:00:00.0001993
MichaelSuyama1993-10-17 00:00:00.0001993

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 Dzien
FROM Production.WorkOrder
WHERE DATENAME(MONTH,StartDate) = 'June'
AND DATENAME(WEEKDAY,StartDate) = 'Friday';

Wynik:

ProductIDStartDateMiesiacDzien
3502013-06-07 00:00:00.000JuneFriday
5312013-06-07 00:00:00.000JuneFriday
7792013-06-14 00:00:00.000JuneFriday
7802013-06-14 00:00:00.000JuneFriday

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 Kwartal
FROM Production.WorkOrder;

Wynik:

ProductIDStartDateKwartal
3502011-07-25 00:00:00.0003
5312011-07-25 00:00:00.0003
7492011-07-26 00:00:00.0003
7512011-07-26 00:00:00.0003

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 AdventureWorks2017
SELECT DueDate,
DATEFROMPARTS(2018, MONTH(DueDate), DAY(DueDate))
as ZmienionaData
FROM [Purchasing].[PurchaseOrderDetail];

Wynik:

DueDateZmienionaData
2011-04-30 00:00:00.0002018-04-30
2011-04-30 00:00:00.0002018-04-30
2011-05-14 00:00:00.0002018-05-14
2011-05-14 00:00:00.0002018-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 OstDzienMiesiaca
FROM Orders
WHERE EOMONTH(OrderDate) = '19960831';

Wynik:

CustomerIDOrderIDOrderDateOstDzienMiesiaca
WARTH102701996-08-01 00:00:00.0001996-08-31
SPLIR102711996-08-01 00:00:00.0001996-08-31
RATTC102721996-08-02 00:00:00.0001996-08-31
QUICK102731996-08-05 00:00:00.0001996-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 sprdata
FROM Orders;

Wynik:

CustomerIDOrderIDOrderDatesprdata
VINET102481996-07-04 00:00:00.0001
TOMSP102491996-07-05 00:00:00.0001
HANAR102501996-07-08 00:00:00.0001

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.

Ewa Barbara Lelusz
Ewa Barbara Lelusz
Analityk biznesowy
Udostępnij wpis:udostępnij Facebookudostępnij Linkedinudostępnij e-mail

Polecane