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ęść daty | skrót |
day | dd,d |
week | wk,ww |
month | mm,m |
quarter | qq,q |
year | yy,yyyy |
hour | hh |
minute | mi,n |
second | ss,s |
millisecond | ms |
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ę.