Pobieranie części składowych daty i czasu za pomocą T-SQL

SQL Server 2012 oprócz bogatego zbioru typów danych daty i czasu, funkcji zwracających bieżący czas dostarcza także szereg funkcji pozwalających na pobieranie tylko wybranej części daty lub czasu.

Jedną z takich funkcji jest DAY(date) , która zwraca w postaci liczby całkowitej dzień miesiąca z przekazanej jako parametr daty. Parametrem może być dowolny typ danych daty i czasu. Jak widać w poniższym przykładzie format takiej daty też może być dowolny.

SELECT  DAY( '2016-8-24' ), DAY( '2016/8/25' )
       ,DAY( '20160826' ), DAY( '2016.08.27' );

Przekazać w parametrze możemy także funkcję zwracającą bieżącą datę i czas.

SELECT  DAY( SYSDATETIME() ), DAY( SYSDATETIMEOFFSET() ), DAY( SYSUTCDATETIME() );
       ,DAY( CURRENT_TIMESTAMP ), DAY( GETDATE() ), DAY( GETUTCDATE() ) ;


Oprócz daty parametr może także pobierać liczbę całkowitą. Liczba ta oznacza zawsze liczbę dni.  Przy tym parametrze jest brana pod uwagę data 1 stycznia1900 roku, do której jest dodawana liczba din z parametru. Poniżej przykład:

SELECT  DAY(0) as '0 days', DAY(5) as '5 days', DAY(30) as '30 days'
       ,DAY(31) as '31 days', DAY(300) as '300 days';

Kolejna funkcja to MONTH(date) . Zwraca ona w postaci liczby całkowitej miesiąc z przekazanej jako parametr daty. Parametrem może być dowolny typ danych daty i czasu. Jak widać w poniższym przykładzie format takiej daty też może być dowolny.

SELECT  MONTH( '2016-8-24' ), MONTH( '2016/8/25' )
       ,MONTH( '20160826' ), MONTH( '2016.08.27' );

SELECT  MONTH( SYSDATETIME() ), MONTH( SYSDATETIMEOFFSET() ), MONTH( SYSUTCDATETIME() )
       ,MONTH( CURRENT_TIMESTAMP ), MONTH( GETDATE() ), MONTH( GETUTCDATE() ) ;


Oprócz daty parametr może także pobierać liczbę całkowitą. Liczba ta oznacza zawsze liczbę dni.  Przy tym parametrze jest brana pod uwagę data 1 stycznia1900 roku, do której jest dodawana liczba din z parametru. Poniżej przykład:

SELECT MONTH(0) as 'month for 0 days', MONTH(547) as 'month for 547 days'
      ,MONTH(311) as 'month for 311 days';

Podobna funkcja to YEAR(date) , która zwraca w postaci liczby całkowitej rok z przekazanej jako parametr daty. Parametrem może być dowolny typ danych daty i czasu. Jak widać w poniższym przykładzie format takiej daty też może być dowolny.

SELECT  YEAR( '2016-8-24' ), YEAR( '2016/8/25' )
       ,YEAR( '20160826' ), YEAR( '2016.08.27' );

SELECT  YEAR( SYSDATETIME() ), YEAR( SYSDATETIMEOFFSET() ), YEAR( SYSUTCDATETIME() )
       ,YEAR( CURRENT_TIMESTAMP ), YEAR( GETDATE() ), YEAR( GETUTCDATE() ) ;

qw12

Oprócz daty parametr może także pobierać liczbę całkowitą. Liczba ta oznacza zawsze liczbę dni.  Przy tym parametrze jest brana pod uwagę data 1 stycznia1900 roku, do której jest dodawana liczba din z parametru. Poniżej przykład:

SELECT YEAR(0) as 'year for 0 days', YEAR(1111) as 'year for 1111 days'
      ,YEAR(3211) as 'year for 3211 days';

Poza wymienionymi wyżej funkcjami T-SQL dostarcza również takie funkcje jak: DATENAME (datepart, date) oraz DATEPART (datepart, date). Pierwsza z nich zwraca łańcuch znakowy( typ danych nvarchar ) jako część daty lub czasu wyspecyfikowanej z parametru datepart i daty podanej jako drugi parametr.  Druga z funkcji pobiera te same parametry, ale zwraca  liczbę całkowitą.

Parametr date w tych funkcjach może stanowić dowolny typ danych daty i czasu. Natomiast parametr datepart może przyjmować jedną z wymienionych wartości lub ich skróty, informujące o tym, jak część daty i czasu ma być zwrócona.

year           yy, yyyy
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
microsecond mcs
nanosecond  ns
TZoffset    tz

Poniższe przykłady pokazują sposób działania tych funkcji:

SELECT  DATENAME( q, SYSDATETIME() );

SELECT  DATENAME( m, SYSDATETIME() ), DATEPART( m, SYSDATETIME() );

SELECT  DATENAME( weekday, SYSDATETIME() ), DATEPART( weekday, SYSDATETIME() );

dd3

SELECT  DATENAME( tz, SYSDATETIME() ), DATEPART( tz, SYSDATETIME() );

SELECT  DATENAME( yyyy, SYSDATETIME() ), DATEPART( yy, SYSDATETIME() );

W większości przypadków wartości zwracane prze te funkcje będą takie same.