DATE_BUCKET (Transact-SQL)
Důležité
Azure SQL Edge bude vyřazeno 30. září 2025. Další informace a možnosti migrace najdete v oznámení o vyřazení.
Poznámka:
Azure SQL Edge už nepodporuje platformu ARM64.
Tato funkce vrátí hodnotu datetime odpovídající začátku každého kontejneru datetime z časového razítka definovaného origin
parametrem 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í jazyka Transact-SQL najdete v tématu Datové typy a funkce data a času jazyka Transact-SQL .
Konvence syntaxe jazyka Transact-SQL
Syntaxe
DATE_BUCKET (datePart , number , date , origin)
Argumenty
datePart
Část data , která se používá s parametrem number, jak je znázorněno v následující tabulce. DATE_BUCKET
nepřijímá ekvivalenty uživatelem definovaných proměnných pro argumenty datePart .
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 |
číslo
Celé číslo, které rozhoduje o šířce kontejneru v kombinaci s argumentem datePart. Představuje šířku kontejnerů datePart z času původu. Tento argument musí být kladná celočíselná hodnota.
rande
Výraz, který se dá přeložit na jednu z následujících hodnot:
- rande
- datetime
- datetime2
- datetimeoffset
- smalldatetime
- Čas
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:
- rande
- datetime
- datetime2
- datetimeoffset
- smalldatetime
- Čas
Datový typ pro původ by se měl shodovat s datovým typem parametru data .
DATE_BUCKET
používá 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ý typ
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.
Vrácené hodnoty
Vysvětlení výstupu z DATE_BUCKET
DATE_BUCKET
vrátí nejnovější hodnotu data nebo času odpovídající parametrům datePart a číslování . 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 6276 týdnů od hodnoty původu 1900-01-01 00:00:00.000
.
DECLARE @date 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
. Je to proto, že 2020-04-13 00:00:00.0000000
6276 týdnů od data původu a 6276 je dělitelné 2, 3, 4 a 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);
Výstup pro níže uvedený výraz je 2020-04-06 00:00:00.0000000
, což je 6275 týdnů od výchozího počátečního času 1900-01-01 00:00:00.000
.
DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 5, @date);
Výstup pro níže uvedený výraz je 2020-06-09 00:00:00.0000000
, což je 75 týdnů od zadaného času 2019-01-01 00:00:00
původu .
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);
Poznámky
Použijte DATE_BUCKET
v následujících klauzulích:
GROUP BY
HAVING
ORDER BY
SELECT <list>
WHERE
Argument datePart
denofyear, day a weekday vrátí stejnou hodnotu. Každá část datePart 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í následující chybovou zprávu: 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);
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 origin
Datový typ argumentů původu a data musí být stejný. Pokud se používají různé datové typy, vygeneruje se chyba.
Příklady
A. Výpočet DATE_BUCKET s šířkou kbelíku 1 z času původu
Každý z těchto příkazů zvýší DATE_BUCKET o šířku kbelíku 1 z doby původu:
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);
Tady je sada 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í AdventureWorksDW2019
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 INT = 365,
@datetime DATETIME2 = '2000-01-01 01:01:01.1110000';/* 2000 was a leap year */;
SELECT DATE_BUCKET(DAY, @days, @datetime);
Tady je sada výsledků.
---------------------------
1999-12-08 00:00:00.0000000
(1 row affected)
Zadání sloupce jako data
V následujícím příkladu počítáme součet OrderQuantity a součet UnitPrice seskupených v týdenních intervalech kalendářních dat.
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;
Tady je sada 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 sada výsledků.
---------------------------
2020-03-02 00:00:00.0000000
(1 row affected)
Určení skalárních poddotazů a skalárních funkcí jako čísla a data
V tomto příkladu se jako argumenty pro číslo a datum používají skalární poddotazyMAX(OrderDate)
. (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 DATETIME2 = '2020-06-15 21:22:11';
DECLARE @origin DATETIME2 = '2019-01-01 00:00:00';
SELECT DATE_BUCKET(HOUR, 2, @date, @origin);