Sdílet prostřednictvím


DATE_BUCKET (Transact-SQL)

Platí na: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance Azure SQL Edge SQL database in Microsoft Fabric

Tato funkce vrátí hodnotu data a času odpovídající začátku každého intervalu data a času z časového razítka definovaného parametrem původu nebo výchozí počáteční hodnotou 1900-01-01 00:00:00.000 , pokud není zadaný parametr původu.

Přehled všech datových typů a funkcí Transact-SQL datových typů a funkcí data a času najdete v tématu Datum a čas .

Transact-SQL konvence syntaxe

Syntaxe

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

Arguments

datepart

Část data , která se používá s parametrem čísla , například rok, měsíc, den, minuta, sekunda.

DATE_BUCKET nepřijímá ekvivalenty proměnných definovaných uživatelem pro argumenty datové části .

datepart Abbreviations
den dd, d
týden Wk, WW
měsíc Mm, m
čtvrt Qq, q
rok yyy, yyyyy
hodina hh
minuta MI, N
vteřina SS, S
milisekunda milisekunda

number

Celé číslo, které rozhoduje o šířce kontejneru v kombinaci s argumentem datepart . Tento argument představuje šířku kbelíků datepart z času původu. Tento argument nemůže být zápornou celočíselnou hodnotou.

date

Výraz, který musí být jednou z následujících hodnot:

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

Pro datum přijímá výraz sloupce, výraz nebo uživatelem definovanou proměnnou, DATE_BUCKET pokud se přeloží na některý z datových typů uvedených výše.

původ

Volitelný výraz, který se dá přeložit na jednu z následujících hodnot:

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

Datový typ pro původ by se měl shodovat s datovým typem parametru data .

DATE_BUCKET Použije výchozí hodnotu data původu 1900-01-01 00:00:00.000 , tj. 12:00 v pondělí 1. ledna 1900, pokud pro funkci není zadána žádná počáteční hodnota.

Návratové typy

Datový typ návratové hodnoty pro tuto metodu je dynamický. Návratový typ závisí na argumentu zadaném pro datum. Pokud je pro datum zadán platný vstupní datový typ, DATE_BUCKET vrátí stejný datový typ. DATE_BUCKET vyvolá chybu, pokud je pro parametr date zadán řetězcový literál.

Návratová hodnota

Vysvětlení výstupu z DATE_BUCKET

DATE_BUCKET vrátí nejnovější hodnotu data nebo času odpovídající parametru datepart a number . Například v následujících výrazech DATE_BUCKET vrátí výstupní hodnotu 2020-04-13 00:00:00.0000000, protože výstup se vypočítá na základě intervalů jednoho týdne z výchozího počátečního 1900-01-01 00:00:00.000času . Hodnota 2020-04-13 00:00:00.0000000 je 6 276 týdnů od hodnoty původu 1900-01-01 00:00:00.000.

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

SELECT DATE_BUCKET(WEEK, 1, @date);

Pro všechny následující výrazy se vrátí stejná výstupní hodnota 2020-04-13 00:00:00.0000000 . Důvodem je to, že 2020-04-13 00:00:00.0000000 od data původu je 6 276 týdnů a 6 276 je dělitelné 2, 3, 4 a 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);

Výstupem následujícího výrazu je 2020-04-06 00:00:00.00000006 275 týdnů od výchozího počátečního času 1900-01-01 00:00:00.000.

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

SELECT DATE_BUCKET(WEEK, 5, @date);

Výstup pro následující výraz je 2020-06-09 00:00:00.0000000, což je 75 týdnů od zadaného času 2019-01-01 00:00:00původu .

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

Argument datepart

denofyear, day a weekday vrátí stejnou hodnotu. Každá část data a její zkratky vrátí stejnou hodnotu.

Číselný argument

Číselnýargument nemůže překročit rozsah kladných int hodnot. V následujících příkazech argument pro číslo překračuje rozsah int o 1. Následující příkaz vrátí chybovou zprávu: 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);

Pokud funkci předá DATE_BUCKET záporná hodnota čísla, vrátí se následující chyba.

Msg 9834, Level 16, State 1, Line 1
Invalid bucket width value passed to DATE_BUCKET function. Only positive values are allowed.

Argument data

DATE_BUCKET vrátí základní hodnotu odpovídající datovému typu argumentu data . V následujícím příkladu se vrátí výstupní hodnota s datovým typem datetime2.

SELECT DATE_BUCKET(DAY, 10, SYSUTCDATETIME());

Argument původu

Datový typ argumentů původua data musí být stejný. Pokud se používají různé datové typy, vygeneruje se chyba.

Poznámky

Použijte DATE_BUCKET v následujících klauzulích:

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

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Výpočet DATE_BUCKET s šířkou kbelíku 1 z času původu

Každý z těchto příkazů se DATE_BUCKET zvýší o šířku kbelíku 1 z doby původu:

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

Tady je soubor výsledků.

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. Použití výrazů jako argumentů pro parametry čísla a data

Tyto příklady používají různé typy výrazů jako argumenty pro parametry čísla a data .

Tyto příklady jsou sestaveny pomocí AdventureWorksDW2025 databáze.

Zadání uživatelem definovaných proměnných jako čísla a data

Tento příklad určuje uživatelem definované proměnné jako argumenty pro číslo a datum:

DECLARE @days AS INT = 365,
        @datetime AS DATETIME2 = '2000-01-01 01:01:01.1110000';

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

Tady je soubor výsledků.

1999-12-08 00:00:00.0000000

Zadání sloupce jako data

V následujícím příkladu vypočítáme součet OrderQuantity a součet seskupených v týdenních intervalech kalendářních UnitPrice dat.

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;

Tady je soubor výsledků.

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

Určení skalární systémové funkce jako data

Tento příklad určuje SYSDATETIME datum. Přesná vrácená hodnota závisí na dni a čase provádění příkazu:

SELECT DATE_BUCKET(WEEK, 10, SYSDATETIME());

Tady je soubor výsledků.

2020-03-02 00:00:00.0000000

Určení skalárních poddotazů a skalárních funkcí jako čísla a data

V tomto příkladu se jako argumenty pro MAX(OrderDate) a datum používají skalární poddotazy. (SELECT TOP 1 CustomerKey FROM dbo.DimCustomer WHERE GeographyKey > 100)slouží jako umělý argument parametru čísla, který ukazuje, jak vybrat číselný argument ze seznamu hodnot.

SELECT DATE_BUCKET(WEEK, (
    SELECT TOP 1 CustomerKey
    FROM dbo.DimCustomer
    WHERE GeographyKey > 100),
    (
        SELECT MAX(OrderDate)
        FROM dbo.FactInternetSales
    )
);

Určení číselných výrazů a skalárních systémových funkcí jako čísla a data

Tento příklad používá číselný výraz ((10/2)) a skalární systémové funkce (SYSDATETIME) jako argumenty pro číslo a datum.

SELECT DATE_BUCKET(WEEK, (10 / 2), SYSDATETIME());

Zadání agregační funkce okna jako čísla

Tento příklad používá agregační funkci okna jako argument pro číslo.

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. Použití jiné než výchozí hodnoty zdroje

V tomto příkladu se k vygenerování kontejnerů kalendářních dat používá jiná než výchozí počáteční hodnota.

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