SQL Server 2012 - Nowe funkcje daty i czasu  Udostępnij na: Facebook

Autor: Damian Widera

Opublikowano: 2012-12-20

Konwersja i przetwarzanie danych opartych o datę i czas jest jedną z najczęściej wykonywanych operacji w programowaniu bazodanowym. Każda kolejna wersja SQL Server dostarcza nowych sposobów na pracę z danymi przechowującymi datę i/lub czas. W SQL Server 2012 pojawiło się siedem nowych funkcji:

  • DATEFROMPARTS,
  • DATETIMEFROMPARTS,
  • DATETIME2FROMPARTS,
  • DATETIMOFFSETEFROMPARTS,
  • EOMONTH,
  • SMALLDATETIMEFROMPARTS,
  • TIMEFROMPARTS.

Funkcja DATEFROMPARTS zwraca datę dla podanych wartości parametrów: year, month oraz day:

DATEFROMPARTS ( year, month, day )

Dla przykładu, poniższe zapytanie zwróci wynik, którego typem danych jest date:

SELECT DATEFROMPARTS(2012,10,1)
----------
2012-10-01

(1 row(s) affected)

Funkcją nieco bardziej rozbudowaną jest DATETIMEFROMPARTS, która zwraca typ danych datetime:

DATETIMEFROMPARTS ( year, month, day, hour, minute, seconds, milliseconds )

Uruchamiając poniższy przykład:

SELECT DATETIMEFROMPARTS ( 2012, 10, 1, 12, 0, 5, 0)

otrzymujemy wynik w postaci:

-----------------------
2012-10-01 12:00:05.000

(1 row(s) affected)

Funkcja DATETIME2FROMPARTS, która zwraca dane typu datetime2, przyjmuje jeszcze inne parametry :

DATETIME2FROMPARTS ( year, month, day, hour, minute, seconds, fractions, precision )

Najbardziej interesujące z nich to :

  • fractions – frakcje czasu, których znaczenie opisano poniżej,
  • precision – liczba całkowita, określająca precyzję typu danych datetime2.

Parametr fraction zależy od parametru precision, jeśli precision wynosi 7, to każda wartość parametru fraction reprezentuje 100 ns. Analogicznie, jeśli precision ma wartość 3, to fraction wynosi 1 ms. Jeśli precision wynosi 0, to parametr fraction również musi być równy 0, bo w przeciwnym wypadku system zgłosi błąd.

Poniższy przykład ilustruje działanie tej funkcji:

SELECT DATETIME2FROMPARTS ( 2012, 10, 1, 12, 0, 44, 5, 1 );
SELECT DATETIME2FROMPARTS ( 2012, 10, 1, 12, 0, 44, 50, 2 );
SELECT DATETIME2FROMPARTS ( 2012, 10, 1, 12, 0, 44, 500, 3 );

Otrzymany wynik:

---------------------------
2012-10-01 12:00:44.5

(1 row(s) affected)


---------------------------
2012-10-01 12:00:44.50

(1 row(s) affected)


---------------------------
2012-10-01 12:00:44.500

(1 row(s) affected)

Funkcja DATETIMOFFSETEFROMPARTS zwraca informacje na temat daty i czasu, uzupełnione o określony offset (strefę czasową) wraz z podaną precyzją:

DATETIMEOFFSETFROMPARTS ( year, month, day, hour, minute, seconds, fractions, hour_offset, minute_offset, precision )

Parametry fractions oraz precision mają takie samo znaczenie, jak dla wcześniej omówionej funkcji DATETIME2FROMPARTS. Nowe parametry – hour_offset oraz minute_offset pozwalają skonstruować przesunięcie do odpowiedniej strefy czasowej. Obydwa parametry należy podać równocześnie, tzn. nie można wskazać tylko godziny lub tylko minut. Ich wartości muszą być albo dodatnie albo ujemne, np.:

SELECT DATETIMEOFFSETFROMPARTS ( 2012, 10, 1, 12, 17, 10, 0, -12,-1, 7 ) ;
SELECT DATETIMEOFFSETFROMPARTS ( 2012, 10, 1, 12, 17, 10, 0, 12,1, 7 ) ;

----------------------------------
2012-10-01 12:17:10.0000000 -12:01

(1 row(s) affected)


----------------------------------
2012-10-01 12:17:10.0000000 +12:01

(1 row(s) affected)

Funkcja EOMONTH znana jest głównie użytkownikom oraz programistom bazy danych Access oraz programu Excel. Wyświetla datę ostatniego dnia miesiąca dla dodanej daty. Można również opcjonalnie dodać liczbę miesięcy do daty wskazanej w pierwszym parametrze i na tej podstawie zwrócić ostatni dzień miesiąca. Składnia funkcji jest następująca:

EOMONTH ( start_date [, month_to_add ] )

Użycie tej funkcji w najprostszy sposób przedstawiono poniżej:

DECLARE @date DATETIME
SET @date = GETDATE()
SELECT EOMONTH ( @date )
----------
2012-10-31

(1 row(s) affected)

Użycie paramteru month_to_add pokazano na przykładzie:

DECLARE @date DATETIME
SET @date = GETDATE()
SELECT EOMONTH ( @date ) AS 'bieżący miesąc'
SELECT EOMONTH ( @date, 1 ) AS 'następny miesiąc'
SELECT EOMONTH ( @date, -1 ) AS 'zeszły miesiąc'
GO

bieżący miesąc
--------------
2012-10-31

(1 row(s) affected)

następny miesiąc
----------------
2012-11-30

(1 row(s) affected)

zeszły miesiąc
--------------
2012-09-30

(1 row(s) affected)

Funkcja SMALLDATETIMEFROMPARTS działa identycznie jak funkcja DATETIMEFROMPARTS, z tą różnicą, że zwracana wartość jest typu smalldatetime, co powoduje również ograniczenie liczby parametrów wejściowych funkcji:

SMALLDATETIMEFROMPARTS ( year, month, day, hour, minute )

Przykładowe użycie funkcji jest następujące:

SELECT SMALLDATETIMEFROMPARTS ( 2012, 10, 1, 14, 7 )

Uzyskany wynik ma postać:

-----------------------
2012-10-01 14:07:00

(1 row(s) affected)

Ostatnią nową funkcją związaną z typami daty i czasu jest TIMEFROMPARTS, zwracająca typ time, a jej składnia jest następująca:

TIMEFROMPARTS ( hour, minute, seconds, fractions, precision )

Parametry przez nią przyjmowane zostały opisane przy okazji omawiania wcześniejszych funkcji. Poniżej zaprezentowano sposób jej użycia:

SELECT TIMEFROMPARTS ( 12, 3, 9, 5, 1 );
SELECT TIMEFROMPARTS ( 12, 3, 9, 50, 2 );
SELECT TIMEFROMPARTS ( 12, 3, 9, 500, 3 );

----------------
12:03:09.5

(1 row(s) affected)


----------------
12:03:09.50

(1 row(s) affected)


----------------
12:03:09.500

(1 row(s) affected)

Na zakończenie warto pamiętać, że:

  • parametry większości funkcji są obowiązkowe,
  • funkcje te mogą być użyte jako konstruktory dla zmiennych określonego typu.