DATE_BUCKET (Transact-SQL)

Önemli

Azure SQL Edge artık ARM64 platformunu desteklememektedir.

Bu işlev, parametre tarafından tanımlanan zaman damgasından veya kaynak parametresi belirtilmezse varsayılan kaynak değerinden origin her tarih saat demetinin 1900-01-01 00:00:00.000 başlangıcına karşılık gelen tarih saat değerini 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 İşlevleri (Transact-SQL).

Transact-SQL Sözdizimi Kuralları

Sözdizimi

DATE_BUCKET (datePart , number , date , origin)

Bağımsız değişkenler

Datepart

Aşağıdaki tabloda gösterildiği gibi tarihin 'number' parametresiyle kullanılan bölümü. DATE_BUCKETdatePart bağımsız değişkenleri için kullanıcı tanımlı değişken eşdeğerlerini kabul etmez.

Datepart Kısaltmalar
Gün dd, d
Hafta wk, ww
Ay mm, m
Çeyrek qq, q
Yıl yy, yyyy
Saat hh
Dakika mi, n
Ikinci ss, s
Milisaniye Bayan

Numarası

Demetin genişliğine datePart bağımsız değişkeniyle birlikte karar veren tamsayı sayısı. Bu, başlangıç saatinden datePart demetlerinin genişliğini temsil eder. Bu bağımsız değişkenin pozitif bir tamsayı değeri olması gerekir.

Tarih

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

  • Tarih
  • Datetime
  • datetime2
  • Datetimeoffset
  • Smalldatetime
  • Zaman

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ökenli

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

  • Tarih
  • Datetime
  • datetime2
  • Datetimeoffset
  • Smalldatetime
  • Zaman

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

DATE_BUCKETişlevi için kaynak değeri belirtilmemişse 1 Ocak 1900 Pazartesi günü varsayılan başlangıç tarihi değeri 1900-01-01 00:00:00.000olan 12:00'yi kullanır.

Dönüş türü

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ğerleri

Çıkışını anlama DATE_BUCKET

DATE_BUCKETdatePart ve number parametrelerine 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 1900-01-01 00:00:00.000bir haftalık demetler temelinde hesaplandığından çıkış değerini 2020-04-13 00:00:00.0000000döndürür. Değeri, başlangıç değerinden 2020-04-13 00:00:00.00000001900-01-01 00:00:00.0006276 haftadır.

DECLARE @date 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 6276 hafta olması ve 6276'nın 2, 3, 4 ve 6 ile bölünebiliyor olmasıdır.

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

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

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

SELECT DATE_BUCKET(WEEK, 5, @date);

Aşağıdaki ifadenin çıktısı, belirtilen çıkış saatinden 2019-01-01 00:00:00itibaren 75 hafta olan şeklindedir 2020-06-09 00:00:00.0000000 .

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

Açıklamalar

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

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

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 aşağıdaki 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 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());

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

Örnekler

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

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

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

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 AdventureWorksDW2019 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 INT = 365,
    @datetime DATETIME2 = '2000-01-01 01:01:01.1110000';/* 2000 was a leap year */;

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

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

---------------------------
1999-12-08 00:00:00.0000000

(1 row affected)

Sütunu tarih olarak belirtme

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

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;

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

(1 row affected)

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 sayı ve tarih bağımsız değişkenleri olarak sayısal ifade (((10/2)) ve skaler sistem işlevleri (SYSDATETIME) 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 DATETIME2 = '2020-06-15 21:22:11';
DECLARE @origin DATETIME2 = '2019-01-01 00:00:00';

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

Ayrıca bkz.