DATE_BUCKET (Transact-SQL)

هام

لم يعد Azure SQL Edge يدعم النظام الأساسي ARM64.

ترجع هذه الدالة قيمة التاريخ والوقت المقابلة لبداية كل مستودع التاريخ والوقت، من الطابع الزمني المحدد بواسطة origin المعلمة أو قيمة الأصل الافتراضية 1900-01-01 00:00:00.000 إذا لم يتم تحديد معلمة الأصل.

راجع أنواع بيانات التاريخ والوقت والدالات (Transact-SQL) للحصول على نظرة عامة على جميع أنواع بيانات التاريخ والوقت ودالات Transact-SQL.

اصطلاحات بناء جملة Transact-SQL

بناء الجملة

DATE_BUCKET (datePart , number , date , origin)

الوسيطات

Datepart

جزء التاريخ المستخدم مع المعلمة "رقم"، كما هو موضح في الجدول التالي. DATE_BUCKET لا يقبل مكافئات المتغير المعرفة من قبل المستخدم لوسائط datePart .

Datepart الاختصارات
اليوم dd، d
الاسبوع wk، ww
الشهر مم، م
الربع qq، q
year yy, yyyyy
hour hh
minute mi، n
second ss، s
millisecond Ms

رقم

رقم العدد الصحيح الذي يحدد عرض المستودع جنبا إلى جنب مع الوسيطة datePart. يمثل هذا عرض مستودعات datePart من وقت الأصل. يجب أن تكون هذه الوسيطة قيمة عدد صحيح موجب .

date

تعبير يمكن حله إلى إحدى القيم التالية:

  • date
  • Datetime
  • التاريخ والوقت2
  • تاريخ البدء
  • وقت صغير
  • الوقت

للتاريخ، DATE_BUCKET يقبل تعبير عمود أو تعبير أو متغير معرف من قبل المستخدم إذا تم حله إلى أي من أنواع البيانات المذكورة سابقا.

المنشا

تعبير اختياري يمكن حله إلى إحدى القيم التالية:

  • date
  • Datetime
  • التاريخ والوقت2
  • تاريخ البدء
  • وقت صغير
  • الوقت

يجب أن يتطابق نوع البيانات للأصل مع نوع بيانات معلمة التاريخ.

DATE_BUCKET يستخدم قيمة تاريخ الأصل الافتراضية ل 1900-01-01 00:00:00.000، أي 12:00 ص يوم الاثنين 1 يناير 1900، إذا لم يتم تحديد قيمة أصل للدالة.

نوع الإرجاع

نوع بيانات القيمة المرجعة لهذا الأسلوب ديناميكي. يعتمد نوع الإرجاع على الوسيطة المتوفرة للتاريخ. إذا تم توفير نوع بيانات إدخال صالح للتاريخ، DATE_BUCKET فسترجع نفس نوع البيانات. DATE_BUCKET يثير خطأ إذا تم تحديد سلسلة حرفية لمعلمة التاريخ .

القيم المرجعة

فهم الإخراج من DATE_BUCKET

DATE_BUCKETإرجاع أحدث قيمة تاريخ أو وقت، مطابقة لمعلمات datePart والأرقام. على سبيل المثال، في التعبيرات التالية، DATE_BUCKET ترجع قيمة الإخراج ل 2020-04-13 00:00:00.0000000، حيث يتم حساب الإخراج استنادا إلى مستودعات أسبوع واحد من وقت الأصل الافتراضي ل 1900-01-01 00:00:00.000. القيمة 2020-04-13 00:00:00.0000000 هي 6276 أسبوعا من قيمة 1900-01-01 00:00:00.000أصل .

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

SELECT DATE_BUCKET(WEEK, 1, @date);

بالنسبة لجميع التعبيرات التالية، يتم إرجاع نفس قيمة الإخراج.2020-04-13 00:00:00.0000000 وذلك لأن 2020-04-13 00:00:00.0000000 6276 أسبوعا من تاريخ الأصل و6276 قابل للقسمة على 2 و3 و4 و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);

إخراج التعبير أدناه هو 2020-04-06 00:00:00.0000000، وهو 6275 أسبوعا من وقت 1900-01-01 00:00:00.000الأصل الافتراضي .

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

SELECT DATE_BUCKET(WEEK, 5, @date);

إخراج التعبير أدناه هو 2020-06-09 00:00:00.0000000 ، وهو 75 أسبوعا من وقت 2019-01-01 00:00:00الأصل المحدد .

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

ملاحظات

استخدم DATE_BUCKET في العبارات التالية:

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

وسيطة datePart

ترجع dayofyear و day و weekday القيمة نفسها. كل datePart واختصاراته ترجع نفس القيمة.

وسيطة الرقم

لا يمكن أن تتجاوز وسيطة الرقم نطاق قيم int الموجبة. في العبارات التالية، تتجاوز وسيطة الرقم نطاق int بمقدار 1. ترجع العبارة التالية رسالة الخطأ التالية: 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);

إذا تم تمرير قيمة سالبة للرقم إلى الدالة DATE_BUCKET ، يتم إرجاع الخطأ التالي.

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

وسيطة التاريخ

DATE_BUCKET إرجاع القيمة الأساسية المطابقة لنوع بيانات وسيطة التاريخ . في المثال التالي، يتم إرجاع قيمة إخراج بنوع بيانات datetime2 .

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

وسيطة الأصل

يجب أن يكون نوع بيانات وسيطات الأصل والتاريخ في هو نفسه. إذا تم استخدام أنواع بيانات مختلفة، يتم إنشاء خطأ.

الأمثلة

ج. حساب DATE_BUCKET بعرض مستودع 1 من وقت الأصل

كل من هذه العبارات زيادة DATE_BUCKET مع عرض مستودع 1 من وقت الأصل:

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

فيما يلي مجموعة النتائج.

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

ب. استخدام التعبيرات كوسيطات لمعلمات الرقم والتاريخ

تستخدم هذه الأمثلة أنواعا مختلفة من التعبيرات كوسيطات لمعلمات الرقم والتاريخ. تم إنشاء هذه الأمثلة باستخدام AdventureWorksDW2019 قاعدة البيانات.

تحديد المتغيرات المعرفة من قبل المستخدم كعدد وتاريخ

يحدد هذا المثال المتغيرات المعرفة من قبل المستخدم كوسيطات للرقم والتاريخ:

DECLARE @days INT = 365,
    @datetime DATETIME2 = '2000-01-01 01:01:01.1110000';/* 2000 was a leap year */;

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

فيما يلي مجموعة النتائج.

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

(1 row affected)

تحديد عمود كتاريخ

في المثال أدناه، نقوم بحساب مجموع OrderQuantity ومجموع UnitPrice المجمعة على مستودعات التاريخ الأسبوعية.

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;

فيما يلي مجموعة النتائج.

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

تحديد دالة النظام العددي كتاريخ

يحدد SYSDATETIME هذا المثال التاريخ. تعتمد القيمة الدقيقة التي تم إرجاعها على يوم ووقت تنفيذ العبارة:

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

فيما يلي مجموعة النتائج.

---------------------------
2020-03-02 00:00:00.0000000

(1 row affected)

تحديد الاستعلامات الفرعية العددية والدالات العددية كعدد وتاريخ

يستخدم هذا المثال الاستعلامات الفرعية العددية، MAX(OrderDate)، كوسيطات للرقم والتاريخ. (SELECT top 1 CustomerKey FROM dbo.DimCustomer where GeographyKey > 100) يعمل كوسيطة اصطناعية لمعلمة الرقم، لإظهار كيفية تحديد وسيطة رقم من قائمة قيم.

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

تحديد التعبيرات الرقمية ووظائف النظام العددي كعدد وتاريخ

يستخدم هذا المثال تعبيرا رقميا ((10/2)) ووظائف النظام العددية (SYSDATETIME) كوسيطات للرقم والتاريخ.

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

تحديد دالة نافذة تجميعية كرقم

يستخدم هذا المثال دالة نافذة تجميعية كوسيطة للرقم.

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

ج. استخدام قيمة أصل غير افتراضية

يستخدم هذا المثال قيمة أصل غير افتراضية لإنشاء مستودعات التاريخ.

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

(راجع أيضًا )