MS SQL Server funkcje daty i czasu z przykładami
Bazy danych

MS SQL Server funkcje daty i czasu

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 oraz Northwind.

Dostępność funkcji zależy od wersji serwera, którą masz zainstalowaną. Jeśli nie możesz jakiejś funkcji znaleźć, sprawdź czy dla używanej przez Ciebie wersji funkcja jest dostępna.

Podstawowe typy danych daty i czasu

Podstawowe typy danych, operujące na datach, które obsługuje SQL Server:

TypFormatZakres
DateYYYY-MM-DDod 0001-01-01 do 9999-12-31
Timehh:mm:ss[.nnnnnnn]od 00:00:00.0000000 do 23:59:59.9999999
DatetimeYYYY-MM-DD hh:mm:ss[.nnn]od 1753-01-01 do 9999-12-31
SmalldatetimeYYYY-MM-DD hh:mm:ssod 1900-01-01 do 2079-06-06

Informacje o pozostałych typach danych i podstawową składnię języka T-SQL znajdziesz w naszym artykule T-SQL odczytywanie danych z bazy

Sposób zapisu daty 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’).

SELECT '20210218'

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ą

Przykład

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.

MS SQL Server funkcja DATEDIFF() przykład

Przykład

Chcemy się dowiedzieć, czy skończymy produkcję poszczególnych towarów na 7 dni lub później niż data wymagalności.

W przykładzie:

  • 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:

MS SQL Server funkcja DATEDIFF() przykład 2

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 int, expression smalldatetime) RETURNS smalldatetime

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 int – 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 smalldatetime – podajemy datę, do której chcemy dodać określoną ilość interwałów np. dni.

Przykład

W kolumnie Data modyfikacji (ModifiedDate) jest data zmiany hasła. Hasło powinno być zmieniane co 90 dni. Za pomocą funkcji DATEADD() 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:

MS SQL Server funkcja DATEADD() przykład

Przykład

Funkcji DATEADD() możemy również używać z godzinami. Umożliwia ona np. dodanie minut lub sekund do określonej godziny.

W przykładzie 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:

MS SQL Server funkcja DATEADD() przykład 2

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 datetime) RETURNS int

Przykład:

W przykładzie:

  • 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:

MS SQL Server funkcja DAY() przykład

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 datetime) RETURNS int

Przykład:

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:

MS SQL Server funkcja MONTH() przykład

Funkcja YEAR()

Funkcja YEAR() zwraca rok z określonej daty.

Składnia funkcji:

YEAR(expression datetime) RETURNS int

Przykład:

Z tabeli Employees w bazie Northwind wybieramy tylko tych pracowników, którzy zatrudnieni zostali w 1993 roku.

USE Northwind;
SELECT FirstName, LastName, BirthDate,
YEAR(HireDate) as rok
FROM Employees
WHERE YEAR(HireDate) = 1993;

MS SQL Server funkcja YEAR() przykład

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) RETURNS nvarchar

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
  • day, dy, y
  • week, ww, wk
  • weekday, dw, w
  • hour, hh
  • minute, mi, n
  • second, ss, s
  • millisecond, ms

Przykład:

W przykładzie za pomocą funkcji DATENAME() wyświetlamy miesiąc oraz dzień słownie i wybieramy tylko te rekordy, dla których data produkcji rozpoczęła się we wszystkie piątki czerwca.

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';

MS SQL Server funkcja DATENAME() przykład

Funkcja DATEPART()

Zwraca liczbę całkowitą reprezentującą określoną część daty.

Składnia funkcji:

DATEPART (datepart, date) RETURNS INT

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

Przykład:

W przykładzie za pomocą funkcji DATEPART() zwracamy dla daty kwartał.

Use AdventureWorks2017;
SELECT ProductID, StartDate,
DATEPART(QUARTER,StartDate) as Kwartal
FROM Production.WorkOrder;

Wynik: MS SQL Server funkcja DATEPART() przykład

Funkcja DATEFROMPARTS()

Funkcja DATEFROMPARTS() została wprowadzona w wersji SQL Server 2012. Akceptuje ona dane wejściowe reprezentujące części daty i godziny i na podstawie tych części konstruuje datę.

Składnia funkcji:

DATEFROMPARTS(year, month, day) RETURNS Date

Przykład:

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: MS SQL Server funkcja DATEFROMPARTS() przykład

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.

Przykład:

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:

MS SQL Server funkcja EOMONTH() przykład

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

Przykład:

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:

MS SQL Server funkcja ISDATE() przykład

Informacje na temat funkcji daty i czasu w PL/SQL Oracle znajdziesz w artykule PL/SQL Oracle funkcje daty i czasu.

Rafał Lelusz

Programista Python, C#
Udostępnij wpis: udostępnij Facebook udostępnij Linkedin udostępnij e-mail

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

    Podobne artykuły z kategorii: Bazy danych

    Może Cię zainteresować