
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:
Typ | Format | Zakres |
Date | YYYY-MM-DD | od 0001-01-01 do 9999-12-31 |
Time | hh:mm:ss[.nnnnnnn] | od 00:00:00.0000000 do 23:59:59.9999999 |
Datetime | YYYY-MM-DD hh:mm:ss[.nnn] | od 1753-01-01 do 9999-12-31 |
Smalldatetime | YYYY-MM-DD hh:mm:ss | od 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.
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:
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:
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:
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:
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:
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;
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';
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:
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:
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:
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:
Informacje na temat funkcji daty i czasu w PL/SQL Oracle znajdziesz w artykule PL/SQL Oracle funkcje daty i czasu.
