Aracılığıyla paylaş


DATE_BUCKET (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance Azure SQL Edge SQL database in Microsoft Fabric

Bu işlev, kaynak parametresi tarafından tanımlanan zaman damgasından her tarih-saat demetinin başlangıcına karşılık gelen tarih-saat değerini veya kaynak parametresi belirtilmezse varsayılan kaynak değerini 1900-01-01 00:00:00.000 döndürür.

Tüm Transact-SQL tarih ve saat veri türlerine ve işlevlerine genel bakış için bkz. Tarih ve saat veri türleri ve işlevleri.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

Arguments

datepart

Tarihinsayı parametresiyle kullanılan bölümü( örneğin, yıl, ay, gün, dakika, saniye).

DATE_BUCKET datepart bağımsız değişkenleri için kullanıcı tanımlı değişken eşdeğerlerini kabul etmez.

datepart Abbreviations
gün dd, d
hafta wk, ww
ay Mm, m
çeyrek qq, q
yıl Yyy, yyyy
saat hh
dakika mi, n
saniye ss, s
milisaniye Ms

sayı

Demetin genişliğine tarih bölümü bağımsız değişkeniyle birlikte karar veren tamsayı sayısı. Bu bağımsız değişken, başlangıç zamanından tarih bölümü demetlerinin genişliğini temsil eder. Bu bağımsız değişken negatif bir tamsayı değeri olamaz.

date

Aşağıdaki değerlerden biri olması gereken ifade:

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

Tarih için, DATE_BUCKET daha önce bahsedilen veri türlerinden herhangi birine çözümlenmesi durumunda bir sütun ifadesi, ifade veya kullanıcı tanımlı değişken kabul eder.

köken

Aşağıdaki değerlerden birine çözümlenebilen isteğe bağlı bir ifade:

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

Kaynak veri türü, tarih parametresinin veri türüyle eşleşmelidir.

DATE_BUCKETişlevi için çıkış noktası değeri belirtilmemişse 1 Ocak 1900 Pazartesi günü saat 12:00 olan varsayılan 1900-01-01 00:00:00.000 tarihi değerini kullanır.

Dönüş türleri

Bu yöntemin dönüş değeri veri türü dinamiktir. Dönüş türü, tarih için sağlanan bağımsız değişkene bağlıdır. Tarih için geçerli bir giriş veri türü sağlanırsa, DATE_BUCKET aynı veri türünü döndürür. DATE_BUCKETtarih parametresi için bir dize değişmez değeri belirtilirse hata verir.

Dönüş değeri

DATE_BUCKET çıkışını anlama

DATE_BUCKETdatepart ve number parametresine karşılık gelen en son tarih veya saat değerini döndürür. Örneğin, aşağıdaki ifadelerde çıkış, DATE_BUCKET varsayılan kaynak saatinden 2020-04-13 00:00:00.0000000bir haftalık demetler temelinde hesaplandığından çıkış değerini 1900-01-01 00:00:00.000döndürür. Değeri, başlangıç değerinden 2020-04-13 00:00:00.00000001900-01-01 00:00:00.0006.276 haftadır.

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

SELECT DATE_BUCKET(WEEK, 1, @date);

Aşağıdaki tüm ifadeler için aynı çıkış değeri 2020-04-13 00:00:00.0000000 döndürülür. Bunun nedeni 2020-04-13 00:00:00.0000000 , başlangıç tarihinden itibaren 6.276 hafta olması ve 6.276'nın 2, 3, 4 ve 6 ile bölünebiliyor olmasıdır.

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

Aşağıdaki ifadenin çıktısı, varsayılan başlangıç zamanından 2020-04-06 00:00:00.0000000itibaren 6.275 hafta olan şeklindedir1900-01-01 00:00:00.000.

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

SELECT DATE_BUCKET(WEEK, 5, @date);

Aşağıdaki ifadenin çıktısı, belirtilen kaynak saatinden 2020-06-09 00:00:00.0000000itibaren 75 hafta olan şeklindedir2019-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);

Datepart bağımsız değişkeni

dayofyear, day ve weekday aynı değeri döndürür. Her datepart ve kısaltmaları aynı değeri döndürür.

Sayı bağımsız değişkeni

Sayı bağımsız değişkeni pozitif int değerleri aralığını aşamaz. Aşağıdaki deyimlerde, sayı bağımsız değişkeni int aralığını 1 aşıyor. Aşağıdaki deyim hata iletisini döndürür: 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);

sayı için negatif bir değer işleve DATE_BUCKET geçirilirse aşağıdaki hata döndürülür.

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

Tarih bağımsız değişkeni

DATE_BUCKETtarih bağımsız değişkeninin veri türüne karşılık gelen temel değeri döndürür. Aşağıdaki örnekte datetime2 veri türüne sahip bir çıkış değeri döndürülür.

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

Kaynak bağımsız değişkeni

içindeki kaynak ve tarih bağımsız değişkenlerinin veri türü aynı olmalıdır. Farklı veri türleri kullanılıyorsa bir hata oluşturulur.

Açıklamalar

Aşağıdaki yan tümcelerde kullanın DATE_BUCKET :

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

Örnekler

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. Başlangıç zamanından itibaren demet genişliği 1 olan DATE_BUCKET hesaplama

Bu deyimlerin her biri, başlangıç zamanından itibaren 1 demet genişliğiyle artar DATE_BUCKET :

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

Sonuç kümesi aşağıdadır.

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. Sayı ve tarih parametreleri için bağımsız değişken olarak ifadeleri kullanma

Bu örneklerde sayı ve tarih parametreleri için bağımsız değişken olarak farklı ifade türleri kullanılır.

Bu örnekler veritabanı kullanılarak AdventureWorksDW2025 oluşturulur.

Kullanıcı tanımlı değişkenleri sayı ve tarih olarak belirtme

Bu örnek, sayı ve tarih için bağımsız değişken olarak kullanıcı tanımlı değişkenleri belirtir:

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

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

Sonuç kümesi aşağıdadır.

1999-12-08 00:00:00.0000000

Sütunu tarih olarak belirtme

Aşağıdaki örnekte, haftalık tarih demetleri OrderQuantity üzerinde gruplandırılmış toplamını ve toplamını UnitPrice hesaplıyoruz.

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;

Sonuç kümesi aşağıdadır.

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

Skaler sistem işlevini tarih olarak belirtin

Bu örnekte tarih belirtildi SYSDATETIME. Döndürülen tam değer, deyimin yürütülme gününe ve saatlerine bağlıdır:

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

Sonuç kümesi aşağıdadır.

2020-03-02 00:00:00.0000000

Skaler alt sorgular ve skaler işlevleri sayı ve tarih olarak belirtin

Bu örnekte sayı MAX(OrderDate) ve tarih bağımsız değişkenleri olarak skaler alt sorgular kullanılır. (SELECT TOP 1 CustomerKey FROM dbo.DimCustomer WHERE GeographyKey > 100)bir sayı bağımsız değişkeninin değer listesinden nasıl seçeceğini göstermek için sayı parametresi için yapay bir bağımsız değişken görevi görür.

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

Sayısal ifadeleri ve skaler sistem işlevlerini sayı ve tarih olarak belirtin

Bu örnekte (10/2) ve SYSDATETIME bağımsız değişkenleri olarak sayısal ifade () ve skaler sistem işlevleri () kullanılır.

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

Sayı olarak bir toplama penceresi işlevi belirtme

Bu örnekte sayı için bağımsız değişken olarak bir toplama penceresi işlevi kullanılır.

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. Varsayılan olmayan bir kaynak değeri kullanma

Bu örnek, tarih demetlerini oluşturmak için varsayılan olmayan bir çıkış noktası değeri kullanır.

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