DATE_BUCKET (Transact-SQL)
Viktigt!
Azure SQL Edge dras tillbaka den 30 september 2025. Mer information och migreringsalternativ finns i meddelandet Om pensionering.
Kommentar
Azure SQL Edge stöder inte längre ARM64-plattformen.
Den här funktionen returnerar det datetime-värde som motsvarar starten för varje datetime-bucket, från tidsstämpeln som definieras av parametern origin
eller standardvärdet 1900-01-01 00:00:00.000
för ursprung för om ursprungsparametern inte har angetts.
Se Datatyper och funktioner för datum och tid (Transact-SQL) för en översikt över alla datatyper och funktioner för Transact-SQL-datum och tid.
Transact-SQL-syntaxkonventioner
Syntax
DATE_BUCKET (datePart , number , date , origin)
Argument
datePart
Den del av datumet som används med parametern "number", som visas i följande tabell. DATE_BUCKET
accepterar inte användardefinierade variabelmotsvarigheter för datePart-argumenten.
datePart | Abbreviations |
---|---|
dag | dd, d |
vecka | wk, ww |
månad | mm, m |
fjärdedel | qq, q |
år | yyy, yyyyy |
timme | hh |
minut | mi, n |
andra | ss, s |
millisekund | Ms |
nummer
Heltalsnumret som bestämmer bredden på bucketen i kombination med argumentet datePart. Detta representerar bredden på datePart-bucketarna från ursprungstiden. Det här argumentet måste vara ett positivt heltalsvärde.
datum
Ett uttryck som kan matcha något av följande värden:
- datum
- datetime
- datetime2
- datetimeoffset
- smalldatetime
- Tid
För datumDATE_BUCKET
accepterar en kolumnuttryck, ett uttryck eller en användardefinierad variabel om de matchar någon av de datatyper som nämnts tidigare.
ursprung
Ett valfritt uttryck som kan matcha något av följande värden:
- datum
- datetime
- datetime2
- datetimeoffset
- smalldatetime
- Tid
Datatypen för ursprunget ska matcha datatypen för datumparametern.
DATE_BUCKET
använder ett standardvärde 1900-01-01 00:00:00.000
för ursprungsdatum, dvs. 12:00 måndagen den 1 januari 1900, om inget ursprungsvärde har angetts för funktionen.
Returtyp
Datatypen returneringsvärde för den här metoden är dynamisk. Returtypen beror på det argument som angetts för datum. Om en giltig indatatyp anges för datumDATE_BUCKET
returnerar samma datatyp. DATE_BUCKET
genererar ett fel om en strängliteral anges för datumparametern .
Returvärden
Förstå utdata från DATE_BUCKET
DATE_BUCKET
returnerar det senaste datum- eller tidsvärdet som motsvarar parametrarna datePart och number . I följande uttryck returnerar DATE_BUCKET
till exempel utdatavärdet 2020-04-13 00:00:00.0000000
för , eftersom utdata beräknas baserat på en veckas bucketar från standardtiden för ursprunget för 1900-01-01 00:00:00.000
. Värdet 2020-04-13 00:00:00.0000000
är 6276 veckor från ursprungsvärdet 1900-01-01 00:00:00.000
för .
DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 1, @date);
För alla följande uttryck returneras samma utdatavärde 2020-04-13 00:00:00.0000000
. Detta beror på att 2020-04-13 00:00:00.0000000
är 6276 veckor från ursprungsdatumet och 6276 är delbar med 2, 3, 4 och 6.
DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 2, @date);
SELECT DATE_BUCKET(WEEK, 3, @date);
SELECT DATE_BUCKET(WEEK, 4, @date);
SELECT DATE_BUCKET(WEEK, 6, @date);
Utdata för uttrycket nedan är 2020-04-06 00:00:00.0000000
, vilket är 6275 veckor från standardtiden 1900-01-01 00:00:00.000
för ursprung .
DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 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(WEEK, 5, @date, @origin);
Kommentarer
Använd DATE_BUCKET
i följande satser:
GROUP BY
HAVING
ORDER BY
SELECT <list>
WHERE
datePart
-argument
dayofyear, day och weekday returnerar samma värde. Varje datePart och dess förkortningar returnerar samma värde.
talargument
Talargumentet 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(DAY, 2147483648, @date);
Om ett negativt värde för tal skickas till DATE_BUCKET
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 datumargumentet. I följande exempel returneras ett utdatavärde med datatypen datetime2 .
SELECT DATE_BUCKET(DAY, 10, SYSUTCDATETIME());
ursprungsargument
Datatypen för argumenten ursprung och datum i måste vara samma. Om olika datatyper används genereras ett fel.
Exempel
A. Beräkna DATE_BUCKET med en bucketbredd på 1 från ursprungstiden
Var och en av dessa instruktioner ökar DATE_BUCKET med en bucketbredd på 1 från ursprungstiden:
DECLARE @date DATETIME2 = '2020-04-30 21:21:21';
SELECT 'Week', DATE_BUCKET(WEEK, 1, @date)
UNION ALL SELECT 'Day', DATE_BUCKET(DAY, 1, @date)
UNION ALL SELECT 'Hour', DATE_BUCKET(HOUR, 1, @date)
UNION ALL SELECT 'Minutes', DATE_BUCKET(MINUTE, 1, @date)
UNION ALL SELECT 'Seconds', DATE_BUCKET(SECOND, 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 parametrarna tal och datum
I de här exemplen används olika typer av uttryck som argument för tal - och datumparametrarna . De här exemplen skapas med hjälp av AdventureWorksDW2019
databasen.
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 grupperad över veckovisa datumbucketar.
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 ShippedDateBucket;
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är systemfunktion som datum
Det här exemplet anger SYSDATETIME
för datum. Det exakta värdet som returneras beror på dagen och tiden för instruktionskörningen:
SELECT DATE_BUCKET(WEEK, 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 talparametern 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
)
);
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 mängdfönsterfunktion som tal
I det här exemplet används en mängdfönsterfunktion som argument för tal.
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 ursprungsvärde som inte är standard
I det här exemplet används ett ursprungsvärde som inte är standard 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(HOUR, 2, @date, @origin);