Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí na: SQL Server 2022 (16.x)
Azure SQL Database
Azure 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 .
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 BYHAVINGORDER BYSELECT <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);