Jest to nowa funkcja w SQL Server 2022. Funkcja DATE_BUCKET zwraca wartość typu data/godzina odpowiadającą początkowi każdego segmentu typu data/godzina na podstawie sygnatury czasowej zdefiniowanej przez parametr origin lub jeśli nie podano pochodzenia, jako data pochodzenia zostanie użyta domyślna wartość 1900-01-01 00:00:00.000

Składnia:

DATE_BUCKET (datepart, number, date, origin)
Datapart

Część daty musi być jedną z poniższych typów z listy. Ten parametr kontroluje rozmiar 1 segmentu. Chcesz otrzymać zestawienie faktur za tydzień, miesiąc czy minutę? datepart będzie kontrolować domyślny rozmiar segmentu.

Część datyskrót
daydd,d
weekwk,ww
monthmm,m
quarterqq,q
yearyy,yyyy
hourhh
minutemi,n
secondss,s
millisecondms

number

Możesz zmienić rozmiar segmentu za pomocą parametru number. Na przykład, jeśli wybierzesz tydzień dla daty, możesz łatwo zmienić rozmiar segmentu na 2 tygodnie, przekazując 2 do tego parametru.

date

Parametr date jest źródłem kolumny DateTime w Twojej tabeli.

origin

origin jest opcjonalny, jeśli chcesz, możesz zmusić SQL Server do rozpoczęcia od niestandardowej daty. Jeśli tydzień pracy Twojej firmy jest inny, możesz kontrolować obliczenia, przekazując jego origin. DATE_BUCKET używa domyślnej wartości daty początkowej 1900-01-01 00:00:00.000, czyli godziny 00:00 w poniedziałek, 1 stycznia 1900, jeśli nie określono żadnej wartości dla tej funkcji.

Argumenty trzeci i czwarty w funkcji (tj. data i origin) mogą być wyrażeniem, którego wynikiem jest jeden z następujących typów danych:

  • date
  • datetime
  • datetime2
  • datetimeoffset
  • smalldatetime
  • time

DECLARE @date DATETIME    = 'Dec 10, 2022 12:05 PM';
DECLARE @origin DATETIME = 'Jan 1, 2022 12:00 AM';

SELECT 'Now' AS [BucketName]
, @date AS [DateBucketValue]

UNION ALL

SELECT 'Year'
, DATE_BUCKET (YEAR, 1, @date, @origin)

UNION ALL

SELECT 'Quarter'
, DATE_BUCKET (QUARTER, 1, @date, @origin)

UNION ALL

SELECT 'Month', 
DATE_BUCKET (MONTH, 1, @date, @origin)

UNION ALL
SELECT 'Week', DATE_BUCKET (WEEK, 1, @date, @origin)

UNION ALL

SELECT 'Day'
, DATE_BUCKET (DAY, 1, @date, @origin)

UNION ALL

SELECT 'Hour'
, DATE_BUCKET (HOUR, 1, @date, @origin)

UNION ALL

SELECT 'Minutes'
, DATE_BUCKET (MINUTE, 1, @date, @origin)

UNION ALL

SELECT 'Seconds', 
DATE_BUCKET (SECOND, 1, @date, @origin)


Należy zwrócić uwagę, że wartość przedziału dat dla części Week to 10 grudnia 2022 r., czyli sobota. Dzieje się tak, ponieważ podana data pochodzenia (1 stycznia 2022 r.) to również sobota. (domyślna data pochodzenia 1 stycznia 1900 to poniedziałek). Dlatego podczas pracy z częścią Week , jeśli chcemy, aby tydzień zaczynał się w niedzielę, należy się upewnić się, że używamy znanego pochodzenia (origin), które przypada w niedzielę.


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl