Date_Bucket (Transact-SQL)
Den här funktionen returnerar datetime-värdet som motsvarar starten av varje datetime-bucket, från tidsstämpeln som definieras av parametern eller standardvärdet för ursprung om origin 1900-01-01 00:00:00.000 ursprungsparametern inte har angetts.
I Datatyper och funktioner för datum och tid (Transact-SQL) en översikt över alla datatyper och funktioner för Transact-SQL och tid.
Syntaxkonventioner SQL Transact-SQL
Syntax
DATE_BUCKET (datePart, number, date, origin)
Argument
Datumdel
Den del av datumet som används med parametern "number". t.ex. År, månad, minut, sekund osv.
Anteckning
DATE_BUCKETaccepterar inte användardefinierade variabelekvivalenter för datePart-argumenten.
| Datumdel | Förkortningar |
|---|---|
| Dag | dd, d |
| Vecka | wk, ww |
| månad | mm, m |
| Quater | qq, q |
| år | yy, yyyy |
| Timme | hh |
| Minuters | mi, n |
| Andra | ss, s |
| Millisekund | Ms |
Nummer
Heltalsnumret som avgör bredden på bucketen kombinerat med argumentet datePart. Detta representerar bredden på dataPart-bucketarna från ursprungstiden. This argument cannot be a negative integer value.
date
Ett uttryck som kan matchas med något av följande värden:
- date
- datetime
- datetime2
- datetimeoffset
- smalldatetime
- Tid
För datum accepterar ett kolumnuttryck, uttryck eller en användardefinierad variabel om de matchar någon av DATE_BUCKET de datatyper som nämns ovan.
Ursprung
Ett valfritt uttryck som kan matchas med något av följande värden:
- date
- datetime
- datetime2
- datetimeoffset
- smalldatetime
- Tid
Datatypen för Origin ska matcha parameterns Date datatyp.
DATE_BUCKET använder standardvärdet för ursprungsdatum, 1900-01-01 00:00:00.000 dvs. 12:00 måndagen den 1 januari 1900, om inget värde för Ursprung har angetts för funktionen.
Returtyp
Datatypen för returvärdet för den här metoden är dynamisk. Returtypen beror på det argument som anges för date . Om en giltig indatatyp anges för date DATE_BUCKET returnerar samma datatyp. DATE_BUCKET höjer ett fel om en stränglitteral har angetts för date parametern.
Returvärden
Förstå utdata från DATE_BUCKET
Date_Bucket returnerar det senaste datum- eller tidsvärdet, som motsvarar parametern datePart och number. I uttrycken nedan returneras till exempel utdatavärdet för , eftersom utdata beräknas baserat på en Date_Bucket 2020-04-13 00:00:00.0000000 veckas bucketar från standardtiden för ursprunget . 1900-01-01 00:00:00.000 Värdet är 2020-04-13 00:00:00.0000000 6276 veckor från ursprungsvärdet för 1900-01-01 00:00:00.000 .
declare @date datetime2 = '2020-04-15 21:22:11'
Select DATE_BUCKET(wk, 1, @date)
För alla uttryck nedan returneras samma 2020-04-13 00:00:00.0000000 utdatavärde för. Det beror på att är 6276 veckor från ursprungsdatum och 2020-04-13 00:00:00.0000000 6276 är delbart med 2, 3, 4 och 6.
declare @date datetime2 = '2020-04-15 21:22:11'
Select DATE_BUCKET(wk, 2, @date)
Select DATE_BUCKET(wk, 3, @date)
Select DATE_BUCKET(wk, 4, @date)
Select DATE_BUCKET(wk, 6, @date)
Utdata för uttrycket nedan är 2020-04-06 00:00:00.0000000 , vilket är 6275 veckor från standardtiden för 1900-01-01 00:00:00.000 ursprunget .
declare @date datetime2 = '2020-04-15 21:22:11'
Select DATE_BUCKET(wk, 5, @date)
Utdata för uttrycket nedan är 2020-06-09 00:00:00.0000000 , vilket är 75 veckor från den angivna ursprungstiden 2019-01-01 00:00:00 .
declare @date datetime2 = '2020-06-15 21:22:11'
declare @origin datetime2 = '2019-01-01 00:00:00'
Select DATE_BUCKET(wk, 5, @date, @origin)
datepart-argument
dayofyear, day och weekday returnerar samma värde. Varje datepart och dess förkortningar returnerar samma värde.
talargument
Argumentet number får inte överskrida intervallet för positiva int-värden. I följande instruktioner överskrider argumentet för tal intervallet för int med 1. Följande instruktion returnerar följande felmeddelande: "Msg 8115, Level 16, State 2, Line 2. Arithmetic overflow error converting expression to data type int."
declare @date datetime2 = '2020-04-30 00:00:00'
Select DATE_BUCKET(dd, 2147483648, @date)
Om ett negativt värde för tal skickas Date_Bucket till funktionen returneras följande fel.
Msg 9834, Level 16, State 1, Line 1
Invalid bucket width value passed to date_bucket function. Only positive values are allowed.
datumargument
DATE_BUCKET returnera basvärdet som motsvarar datatypen för date argumentet. I följande exempel returneras ett utdatavärde med datetime2-datatyp.
Select DATE_BUCKET(dd, 10, SYSUTCDATETIME())
origin Argument
Datatypen för origin argumenten date och i måste vara samma. Om olika datatyper används genereras ett fel.
Kommentarer
Använd DATE_BUCKET i följande satser:
- GROUP BY
- HAVING
- ORDNA EFTER
- VÄLJ <list>
- WHERE
Exempel
A. Beräkna Date_Bucket med bucketbredden 1 från ursprungstiden
Var och en av dessa instruktioner date_bucket med bucketbredden 1 från ursprungstiden:
declare @date datetime2 = '2020-04-30 21:21:21'
Select 'Week', DATE_BUCKET(wk, 1, @date)
Union All
Select 'Day', DATE_BUCKET(dd, 1, @date)
Union All
Select 'Hour', DATE_BUCKET(hh, 1, @date)
Union All
Select 'Minutes', DATE_BUCKET(mi, 1, @date)
Union All
Select 'Seconds', DATE_BUCKET(ss, 1, @date)
Här är resultatuppsättningen.
Week 2020-04-27 00:00:00.0000000
Day 2020-04-30 00:00:00.0000000
Hour 2020-04-30 21:00:00.0000000
Minutes 2020-04-30 21:21:00.0000000
Seconds 2020-04-30 21:21:21.0000000
B. Använda uttryck som argument för tal- och datumparametrar
I de här exemplen används olika typer av uttryck som argument för tal- och datumparametrarna. De här exemplen skapas med databasen "AdventureWorksDW2017".
Ange användardefinierade variabler som tal och datum
I det här exemplet anges användardefinierade variabler som argument för tal och datum:
DECLARE @days int = 365,
@datetime datetime2 = '2000-01-01 01:01:01.1110000'; /* 2000 was a leap year */;
SELECT Date_Bucket(day, @days, @datetime);
Här är resultatuppsättningen.
---------------------------
1999-12-08 00:00:00.0000000
(1 row affected)
Ange en kolumn som datum
I exemplet nedan beräknar vi summan av OrderQuantity och summan av UnitPrice grupperade över veckovisa datum-buckets.
SELECT
Date_Bucket(week, 1 ,cast(Shipdate as datetime2)) AS ShippedDateBucket
,Sum(OrderQuantity) As SumOrderQuantity
,Sum(UnitPrice) As SumUnitPrice
FROM dbo.FactInternetSales FIS
where Shipdate between '2011-01-03 00:00:00.000' and '2011-02-28 00:00:00.000'
Group by Date_Bucket(week, 1 ,cast(Shipdate as datetime2))
order by 1
Här är resultatuppsättningen.
ShippedDateBucket SumOrderQuantity SumUnitPrice
--------------------------- ---------------- ---------------------
2011-01-03 00:00:00.0000000 21 65589.7546
2011-01-10 00:00:00.0000000 27 89938.5464
2011-01-17 00:00:00.0000000 31 104404.9064
2011-01-24 00:00:00.0000000 36 118525.6846
2011-01-31 00:00:00.0000000 39 123555.431
2011-02-07 00:00:00.0000000 35 109342.351
2011-02-14 00:00:00.0000000 32 107804.8964
2011-02-21 00:00:00.0000000 37 119456.3428
2011-02-28 00:00:00.0000000 9 28968.6982
Ange skalärsystemfunktion som datum
Det här exemplet anger SYSDATETIME för datum. Det exakta värde som returneras beror på dag och tid för instruktionskörning:
SELECT Date_Bucket(wk, 10, SYSDATETIME());
Här är resultatuppsättningen.
---------------------------
2020-03-02 00:00:00.0000000
(1 row affected)
Ange skalära underfrågor och skalärfunktioner som tal och datum
I det här exemplet används skalära underfrågor, MAX(OrderDate) , som argument för tal och datum. (SELECT top 1 CustomerKey FROM dbo.DimCustomer where GeographyKey > 100) fungerar som ett artificiellt argument för nummerparametern för att visa hur du väljer ett talargument från en värdelista.
SELECT DATE_BUCKET(week,(SELECT top 1 CustomerKey FROM dbo.DimCustomer where GeographyKey > 100),
(SELECT MAX(OrderDate) FROM dbo.FactInternetSales));
Att ange numeriska uttryck och skalära systemfunktioner som tal och datum
I det här exemplet används ett numeriskt uttryck ((10/2)) och skalära systemfunktioner (SYSDATETIME) som argument för tal och datum.
SELECT Date_Bucket(week,(10/2), SYSDATETIME());
Ange en aggregeringsfönsterfunktion som tal
I det här exemplet används en aggregeringsfönsterfunktion som argument för talet.
Select
DISTINCT DATE_BUCKET(day, 30, Cast([shipdate] as datetime2)) as DateBucket,
First_Value([SalesOrderNumber]) OVER (Order by DATE_BUCKET(day, 30, Cast([shipdate] as datetime2))) as First_Value_In_Bucket,
Last_Value([SalesOrderNumber]) OVER (Order by DATE_BUCKET(day, 30, Cast([shipdate] as datetime2))) as Last_Value_In_Bucket
from [dbo].[FactInternetSales]
Where ShipDate between '2011-01-03 00:00:00.000' and '2011-02-28 00:00:00.000'
order by DateBucket
GO
C. Använda ett ursprung som inte är standardvärde
I det här exemplet används ett ursprung som inte är standardvärde för att generera datum buckets.
declare @date datetime2 = '2020-06-15 21:22:11'
declare @origin datetime2 = '2019-01-01 00:00:00'
Select DATE_BUCKET(hh, 2, @date, @origin)