SQL - DATE_BUCKET() 函式



SQL 的 DATE_BUCKET() 函式允許您將資料分組到對應於固定時間段的組中。根據提供給函式的引數,它返回標記每個日期時間儲存桶開始的日期時間值。

日期儲存桶函式顧名思義,計算具有單個定義大小的日期儲存桶。如果向函式提供日期和儲存桶大小,則該函式將返回儲存該日期的儲存桶的起始日期。

語法

以下是 SQL DATE_BUCKET() 函式的語法:

DATE_BUCKET (datepart, number, date, origin)

引數

此函式接受四個引數。下面將討論相同的引數:

  • datepart − 用於與數字一起使用的日期部分。例如,年、分鐘、小時等。

  • number − 這是一個整數,它將決定與 datepart 引數組合的儲存桶寬度。它應該是一個正整數,因為它表示從原點時間開始的 datepart 儲存桶的寬度。

  • date − DATE_BUCKET 接受表示式、列表達式或使用者定義的日期變數,如果它們解析為以下任何資料型別,例如 date、datetime、datetime2、datetimeoffset、smalldatetime、time。

  • origin − 原點資料型別應與日期引數的資料型別匹配。如果未為函式指定原點值,則 DATE_BUCKET 使用預設原點日期值。

示例

讓我們來看一下 SQL DATE_BUCKET() 函式的以下示例,其中寬度為 1 天,使用以下查詢:

DECLARE @date date = '2023-02-21',
@origin date = '2023-02-05';
SELECT DATE_BUCKET(DAY, 1, @date, @origin);

輸出

當我們執行上面的查詢時,輸出如下:

+------------+
| Result     |
+------------+
| 2023-02-21 |
+------------+

示例

這是另一種情況,我們將使用以下查詢分別將引數遞增到 2、3、4:

DECLARE @date date = '2023-02-21',
@origin date = '2023-02-05';
SELECT 
   DATE_BUCKET(day, 1, @date, @origin) AS "1 day",
   DATE_BUCKET(day, 2, @date, @origin) AS "2 days",
   DATE_BUCKET(day, 3, @date, @origin) AS "3 days",
   DATE_BUCKET(day, 4, @date, @origin) AS "4 days";

輸出

查詢執行後,將生成如下所示的輸出:

+------------+------------+------------+------------+
| 1day       | 2 days     | 3 days     | 4 days     |
+------------+------------+------------+------------+
| 2023-02-21 | 2023-02-21 | 2023-02-20 | 2023-02-21 |
+------------+------------+------------+------------+

示例

在下面的示例中,我們將設定一個 7 天的寬度,但是 @date 和 @origin 之間只剩下 5 天了,讓我們看看使用以下查詢的結果:

DECLARE 
   @date date = '2023-02-21',
   @origin date = '2023-02-17';
SELECT DATE_BUCKET(day, 7, @date, @origin) AS OriginDate;

輸出

執行上述查詢後,輸出將顯示如下:

+------------+
| OriginDate |
+------------+
| 2023-02-17 |
+------------+

示例

讓我們來看另一個場景,我們將使用 7 天的寬度,並增加兩個日期之間的間隔,並使用以下查詢檢查結果:

DECLARE 
   @date date = '2023-02-21',
   @origin date = '2023-02-10';
SELECT DATE_BUCKET(day, 7, @date, @origin) AS Result;

輸出

當查詢執行時,將生成如下所示的輸出:

+------------+
| Result     |
+------------+
| 2023-02-17 |
+------------+

示例

讓我們來看另一個示例,我們將使用使用者定義的變數作為 number 和 date 的引數,並透過執行以下查詢來檢查結果:

DECLARE @days int = 365,
        @datetime datetime2 = '2023-02-21 18:03:59.8684429';;
SELECT Date_Bucket(DAY, @days, @datetime) AS Result;

輸出

上面查詢的輸出如下所示:

+-----------------------------+
| Result                      |
+-----------------------------+
| 2022-12-02 00:00:00.0000000 |
+-----------------------------+

示例

在下面的示例中,我們將使用 SYSDATETIME() 作為日期,使用以下查詢:

SELECT Date_Bucket(WEEK, 08, SYSDATETIME()) AS Result;

輸出

查詢執行後,將生成如下所示的輸出:

+-----------------------------+
| Result                      |
+-----------------------------+
| 2023-02-13 00:00:00.0000000 |
+-----------------------------+

示例

這是另一種情況,我們將使用 SYSDATETIME() 和數字表達式 (07/2) 作為 number 和 date 的引數,使用以下查詢:

SELECT Date_Bucket(WEEK,(07/2), SYSDATETIME()) AS Result;

輸出

執行上述查詢後,將生成如下所示的輸出:

+-----------------------------+
| Result                      |
+-----------------------------+
| 2023-02-06 00:00:00.0000000 |
+-----------------------------+

示例

考慮以下示例,我們將使用非預設原點值來生成 date_bucket,使用以下查詢:

Declare @date datetime2 = '2023-02-21 11:34:22';
declare @origin datetime2 = '2023-01-01 00:00:00';
Select DATE_BUCKET(HOUR, 3, @date, @origin) AS Result;

輸出

執行上述查詢後,將生成如下所示的輸出:

+-----------------------------+
| Result                      |
+-----------------------------+
| 2023-02-21 09:00:00.0000000 |
+-----------------------------+
sql-date-functions.htm
廣告
© . All rights reserved.