DATE_BUCKET (Transact-SQL)

Gäller för: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance Azure SQL Edge SQL database in Microsoft Fabric

Den här funktionen returnerar det datum-tid-värde som motsvarar starten för varje datum-tid-bucket från tidsstämpeln som definieras av ursprungsparametern, eller standardvärdet för ursprungsvärdet 1900-01-01 00:00:00.000 för om ursprungsparametern inte har angetts.

Se Datatyper och funktioner för datum och tid för en översikt över alla Transact-SQL datatyper och funktioner för datum och tid.

Transact-SQL syntaxkonventioner

Syntax

DATE_BUCKET (datepart , number , date [ , origin ] )

Arguments

datepart

Den del av datumet som används med talparametern, till exempel år, månad, dag, minut, sekund.

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

number

Heltalsnumret som bestämmer bredden på bucketen i kombination med datepart-argumentet . Det här argumentet representerar bredden på datepart-bucketarna från ursprungstiden. Det här argumentet kan inte vara ett negativt heltalsvärde.

date

Ett uttryck som måste vara ett av följande värden:

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

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:

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

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.

Returtyper

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ärde

Förstå utdata från DATE_BUCKET

DATE_BUCKET returnerar det senaste datum- eller tidsvärdet som motsvarar parametern datepart och number . I följande uttryck returnerar DATE_BUCKET till exempel utdatavärdet 2020-04-13 00:00:00.0000000fö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 6 276 veckor från ursprungsvärdet 1900-01-01 00:00:00.000för .

DECLARE @date AS 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 6 276 veckor från ursprungsdatumet och 6 276 är delbart med 2, 3, 4 och 6.

DECLARE @date AS 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 följande uttryck är 2020-04-06 00:00:00.0000000, vilket är 6 275 veckor från standardtiden 1900-01-01 00:00:00.000för ursprunget .

DECLARE @date AS DATETIME2 = '2020-04-15 21:22:11';

SELECT DATE_BUCKET(WEEK, 5, @date);

Utdata för följande uttryck ä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 AS DATETIME2 = '2020-06-15 21:22:11';
DECLARE @origin AS DATETIME2 = '2019-01-01 00:00:00';

SELECT DATE_BUCKET(WEEK, 5, @date, @origin);

Argumentet datepart

dayofyear, day och weekday returnerar samma värde. Varje datumdel och dess förkortningar returnerar samma värde.

Argumentet number

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 felmeddelandet: Msg 8115, Level 16, State 2, Line 2. Arithmetic overflow error converting expression to data type int.

DECLARE @date AS 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.

Argumentet date

DATE_BUCKETreturnera 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());

Ursprungsargumentet

Datatypen för argumenten ursprung och datum i måste vara samma. Om olika datatyper används genereras ett fel.

Anmärkningar

Använd DATE_BUCKET i följande satser:

  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT <list>
  • WHERE

Examples

Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

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 AS 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 resultatet.

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 AdventureWorksDW2025 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 AS INT = 365,
        @datetime AS DATETIME2 = '2000-01-01 01:01:01.1110000';

SELECT DATE_BUCKET(DAY, @days, @datetime);

Här är resultatet.

1999-12-08 00:00:00.0000000

Ange en kolumn som datum

I följande exempel beräknar vi summan av OrderQuantity och summan av UnitPrice grupperade ö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 AS 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 resultatet.

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 resultatet.

2020-03-02 00:00:00.0000000

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 AS DATETIME2 = '2020-06-15 21:22:11';
DECLARE @origin AS DATETIME2 = '2019-01-01 00:00:00';

SELECT DATE_BUCKET(HOUR, 2, @date, @origin);