آموزش DATEDIFF_BIG در SQL Server با ۱۰ مثال عملی

آموزش تابع DATEDIFF_BIG در SQL Server؛ اختلاف تاریخ برای بازه‌های بزرگ با مثال عملی

توسط admin | گروه SQL Server | 1405/04/28

نظرات 0

آموزش تابع DATEDIFF_BIG در SQL Server؛ اختلاف تاریخ برای بازه‌های بزرگ با مثال عملی

مقدمه

تابع DATEDIFF_BIG یکی از ابزارهای مهم دسته «محاسبه و اختلاف تاریخ» در Microsoft SQL Server است. مانند DATEDIFF مرزهای زمانی را می‌شمارد اما bigint برمی‌گرداند و برای بازه‌های بزرگ ایمن‌تر است. در سامانه‌های واقعی، یک انتخاب کوچک درباره نوع تاریخ می‌تواند روی صحت گزارش مالی، زمان‌بندی سرویس، مرتب‌سازی رخدادها و امکان استفاده از ایندکس اثر مستقیم بگذارد.

این راهنما از نحو پایه شروع می‌کند و سپس پارامترها، نوع خروجی، دقت، رفتار NULL، حالت‌های مرزی، خطاهای رایج و ملاحظات کارایی DATEDIFF_BIG را با ده Query مستقل توضیح می‌دهد. همه تاریخ‌های ثابت با قالب روشن نوشته شده‌اند تا نتیجه تا حد ممکن از LANGUAGE و DATEFORMAT نشست مستقل باشد.

اگر می‌خواهید جایگاه این تابع را در کنار سایر ابزارهای زمانی ببینید، راهنمای جامع توابع تاریخ و زمان SQL Server را نیز مطالعه کنید.

تعریف و نحو تابع DATEDIFF_BIG

مانند DATEDIFF مرزهای زمانی را می‌شمارد اما bigint برمی‌گرداند و برای بازه‌های بزرگ ایمن‌تر است. این رفتار زمانی قابل اتکا است که برنامه‌نویس نوع ورودی، تقویم مورد استفاده و انتظار خود از دقت را صریح مشخص کند. در واحد nanosecond نیز محدوده نهایی bigint باید رعایت شود.

Syntax

DATEDIFF_BIG(datepart, startdate, enddate)

پارامترها و نوع خروجی

بخشتوضیح
پارامترهاواحد، زمان شروع و زمان پایان را دریافت می‌کند.
نوع خروجیbigint
سازگاریSQL Server 2016 و جدیدتر
دقت و محدودیتدر واحد nanosecond نیز محدوده نهایی bigint باید رعایت شود.

در زمان درج خروجی DATEDIFF_BIG در جدول، نوع ستون مقصد اهمیت زیادی دارد. تبدیل ضمنی به نوع قدیمی‌تر یا کم‌دقت‌تر می‌تواند کسر ثانیه، Offset یا دامنه تاریخی را تغییر دهد. بهتر است نوع خروجی را با SELECT آزمایش و سپس Schema را قطعی کنید.

مثال‌های عملی

مثال 1: کاربرد پایه با مقدار ثابت

در نخستین مثال، DATEDIFF_BIG با ورودی صریح اجرا می‌شود تا شکل پایه خروجی روشن باشد.

SELECT DATEDIFF_BIG(millisecond, '2000-01-01', '2026-07-19') AS ResultValue;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 1یک مقدار قطعی متناسب با ورودی ثابت

نکته کاربردی: این خروجی از نوع bigint است و پایه بررسی مثال‌های بعدی محسوب می‌شود.

مثال 2: محاسبه روی چند ردیف داده نمونه

یک مجموعه تاریخ در CTE ساخته می‌شود و DATEDIFF_BIG جداگانه روی هر ردیف عمل می‌کند.

WITH SampleDates(EventDate) AS
(
    SELECT CAST('2026-01-15T08:20:00' AS datetime2)
    UNION ALL
    SELECT CAST('2026-07-19T14:45:30' AS datetime2)
    UNION ALL
    SELECT CAST('2026-12-31T23:59:59' AS datetime2)
)
SELECT EventDate, DATEDIFF_BIG(second, CAST('2000-01-01' AS datetime2), d.EventDate) AS CalculatedValue
FROM SampleDates AS d;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 2سه ردیف همراه مقدار محاسبه‌شده

نکته کاربردی: اجرای مجموعه‌محور معمولاً از حلقه و پردازش ردیف‌به‌ردیف مناسب‌تر است.

مثال 3: استفاده در عبارت SELECT

در این سناریو خروجی DATEDIFF_BIG با تابع دیگری ترکیب می‌شود تا شکل مناسب نمایش یا محاسبه ساخته شود.

SELECT DATEDIFF_BIG(microsecond, '2026-07-19T00:00:00', '2026-07-19T00:00:01') AS CombinedResult;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 3مقدار تبدیل‌شده یا ترکیبی

نکته کاربردی: نوع تبدیل نهایی را صریح انتخاب کنید تا رفتار به تنظیمات نشست وابسته نشود.

مثال 4: استفاده در شرط WHERE

این Query نشان می‌دهد خروجی DATEDIFF_BIG چگونه می‌تواند بخشی از شرط انتخاب داده باشد.

WITH SampleDates(EventDate) AS
(
    SELECT CAST('2026-01-15T08:20:00' AS datetime2)
    UNION ALL
    SELECT CAST('2026-07-19T14:45:30' AS datetime2)
    UNION ALL
    SELECT CAST('2026-12-31T23:59:59' AS datetime2)
)
SELECT EventDate
FROM SampleDates AS d
WHERE DATEDIFF_BIG(second, CAST('2000-01-01' AS datetime2), d.EventDate) IS NOT NULL;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 4ردیف‌هایی که نتیجه معتبر دارند

نکته کاربردی: برای جدول بزرگ، اثر تابع روی SARGability و امکان استفاده از ایندکس را بررسی کنید.

مثال 5: ترکیب با توابع دیگر تاریخ

ترکیب DATEDIFF_BIG با ابزارهای تاریخ SQL Server یک خروجی قابل استفاده در منطق کسب‌وکار می‌سازد.

SELECT DATEDIFF_BIG(microsecond, '2026-07-19T00:00:00', '2026-07-19T00:00:01') AS BusinessValue, DATEDIFF_BIG(millisecond, '2000-01-01', '2026-07-19') AS BaseValue;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 5دو ستون پایه و ترکیبی

نکته کاربردی: نمایش هم‌زمان ورودی و خروجی، تست و عیب‌یابی تبدیل را ساده‌تر می‌کند.

مثال 6: رفتار در برابر NULL

این مثال مشخص می‌کند وقتی یکی از ورودی‌های DATEDIFF_BIG تهی باشد چه خروجی دریافت می‌شود.

SELECT DATEDIFF_BIG(day, CAST(NULL AS date), GETDATE()) AS NullResult;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 6NULL یا مقدار کنترل‌شده تابع

نکته کاربردی: پیش از جایگزینی NULL با مقدار پیش‌فرض، معنای تجاری نبود داده را مشخص کنید.

مثال 7: بررسی حالت مرزی

یک مقدار مرزی معتبر برای آزمودن دقت، دامنه یا تغییر دوره در DATEDIFF_BIG انتخاب شده است.

SELECT DATEDIFF_BIG(nanosecond, '2026-07-19T00:00:00', '2026-07-19T00:00:00.0000001') AS BoundaryResult;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 7نتیجه معتبر در مرز تعریف‌شده

نکته کاربردی: در واحد nanosecond نیز محدوده نهایی bigint باید رعایت شود.

مثال 8: سناریوی گزارش‌گیری سازمانی

در این مثال، DATEDIFF_BIG برای تولید کلید گزارش یا دسته‌بندی سفارش‌ها استفاده می‌شود.

DECLARE @Orders TABLE (OrderId int, EventDate datetime2, Amount decimal(10,2));
INSERT INTO @Orders VALUES
(1,'2026-01-15T08:20:00',120.00),
(2,'2026-01-20T10:00:00',180.00),
(3,'2026-07-19T14:45:30',250.00);
SELECT DATEDIFF_BIG(second, '2000-01-01', d.EventDate) AS ReportKey, COUNT(*) AS OrderCount, SUM(d.Amount) AS TotalAmount
FROM @Orders AS d
GROUP BY DATEDIFF_BIG(second, '2000-01-01', d.EventDate);
خروجینتیجه نمونه یا انتظار
نتیجه مثال 8چند گروه گزارش با تعداد و مبلغ

نکته کاربردی: در گزارش پرتکرار، ستون محاسبه‌شده پایدار یا جدول تقویم می‌تواند هزینه CPU را کاهش دهد.

مثال 9: روش اشتباه و نسخه اصلاح‌شده

ابتدا یک اشتباه رایج مرتبط با DATEDIFF_BIG در TRY/CATCH مهار می‌شود و سپس روش روشن‌تر اجرا می‌گردد.

BEGIN TRY
    EXEC sys.sp_executesql N'SELECT DATEDIFF(millisecond, ''2000-01-01'', GETDATE()) AS Risky;';
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
SELECT DATEDIFF_BIG(millisecond, '2000-01-01', GETDATE()) AS Safe;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 9پیام خطا یا تفاوت خروجی روش‌ها

نکته کاربردی: ورودی‌های صریح، قالب ISO و نوع داده مشخص از خطاهای وابسته به نشست جلوگیری می‌کنند.

مثال 10: الگوی مناسب برای ایندکس

هدف این مثال حفظ امکان Seek است؛ بنابراین DATEDIFF_BIG روی ستون EventDate در Predicate اصلی اجرا نمی‌شود.

DECLARE @Start date = DATEFROMPARTS(2026, 7, 1);
DECLARE @End date = DATEADD(month, 1, @Start);
DECLARE @Events TABLE (EventId int, EventDate datetime2, INDEX IX_EventDate NONCLUSTERED (EventDate));
INSERT INTO @Events VALUES (1,'2026-06-30'),(2,'2026-07-10'),(3,'2026-08-01');
-- از قرار دادن DATEDIFF_BIG روی EventDate در شرط اصلی پرهیز می‌کنیم.
SELECT EventId, EventDate
FROM @Events
WHERE EventDate >= @Start AND EventDate < @End;
خروجینتیجه نمونه یا انتظار
نتیجه مثال 10فقط EventId برابر 2

نکته کاربردی: bigint فضای بیشتری دارد؛ تنها وقتی دامنه واقعاً بزرگ است آن را در خروجی و ایندکس نگه دارید.

خطاهای رایج و روش عیب‌یابی

رایج‌ترین مشکل در DATEDIFF_BIG معمولاً از خود تابع نیست، بلکه از تبدیل ضمنی رشته، دامنه نامعتبر، انتظار نادرست از نوع خروجی یا تنظیمات نشست ایجاد می‌شود. هنگام عیب‌یابی، ابتدا مقدار و نوع هر آرگومان را جداگانه SELECT کنید و سپس فراخوانی نهایی را بسازید.

  • از تاریخ‌های رشته‌ای مبهم مانند 07/08/26 دوری کنید و DATEFROMPARTS یا قالب ISO به کار ببرید.
  • نوع خروجی واقعی bigint را با نوع ستون، متغیر یا پارامتر مقصد مقایسه کنید.
  • رفتار NULL و داده خارج از محدوده را در TRY/CATCH یا مرحله اعتبارسنجی آزمایش کنید.
  • SET LANGUAGE، SET DATEFORMAT و SET DATEFIRST را در محیط توسعه و سرور تولید یکسان فرض نکنید.

برای خطاهای تبدیل، TRY_CONVERT می‌تواند به جای توقف Batch مقدار NULL برگرداند؛ اما نباید بدون ثبت خطا داده نامعتبر را پنهان کرد. در پروژه‌های حساس، مقدار خام، مقدار تبدیل‌شده و علت رد شدن داده را جدا نگه دارید تا مسیر حسابرسی DATEDIFF_BIG قابل پیگیری باشد.

ملاحظات Performance

تابع DATEDIFF_BIG به تنهایی لزوماً پرهزینه نیست، اما اجرای آن برای میلیون‌ها ردیف یا قرار دادن آن روی ستون ایندکس‌شده در Predicate می‌تواند هزینه Query را افزایش دهد. bigint فضای بیشتری دارد؛ تنها وقتی دامنه واقعاً بزرگ است آن را در خروجی و ایندکس نگه دارید.

برای سنجش واقعی از Actual Execution Plan، آمار IO و زمان CPU استفاده کنید. اگر یک عبارت زمانی در گزارش‌های متعدد تکرار می‌شود، ستون محاسبه‌شده پایدار، ایندکس مناسب، جدول تقویم یا محاسبه یک‌باره مرزها را ارزیابی کنید. تصمیم باید بر اساس حجم داده و الگوی دسترسی باشد، نه فقط کوتاه بودن Query.

بهترین روش‌ها و کاربرد واقعی

  1. قرارداد روشنی برای UTC، زمان محلی و Offset در کل سامانه تعریف کنید.
  2. نوع date، time، datetime2 یا datetimeoffset را بر اساس نیاز انتخاب کنید و از datetime قدیمی فقط با دلیل سازگاری استفاده کنید.
  3. ورودی‌ها و خروجی DATEDIFF_BIG را با NULL، انتهای ماه، سال کبیسه و مرز روز آزمایش کنید.
  4. در WHERE از بازه نیمه‌باز شامل شروع و غیرشامل پایان استفاده کنید تا کسر ثانیه از قلم نیفتد.
  5. منطق تقویمی و فرض‌های منطقه زمانی را در مستندات Schema و کد ثبت کنید.

در کاربرد واقعی، DATEDIFF_BIG می‌تواند بخشی از گزارش فروش، محاسبه SLA، زمان انقضای دسترسی، ثبت Audit یا پاک‌سازی دوره‌ای باشد. طراحی مناسب باعث می‌شود همان منطق در API، Job و گزارش نتیجه یکسانی تولید کند و اختلاف ساعت سرور یا تبدیل‌های پنهان باعث مغایرت نشود.

سؤالات متداول

تابع DATEDIFF_BIG دقیقاً چه کاری انجام می‌دهد؟

مانند DATEDIFF مرزهای زمانی را می‌شمارد اما bigint برمی‌گرداند و برای بازه‌های بزرگ ایمن‌تر است. مهم است که ورودی‌ها با نوع داده صریح ارسال شوند و خروجی bigint در طراحی ستون مقصد لحاظ شود.

برای شروع کار با DATEDIFF_BIG چه چیزی باید بدانیم؟

ابتدا نحو DATEDIFF_BIG(datepart, startdate, enddate) را یاد بگیرید، سپس با مقدار ISO ثابت آزمایش کنید. بعد از اطمینان از نوع خروجی، آن را وارد Query واقعی کنید.

DATEDIFF_BIG در پروژه‌های تجاری چه کاربردی دارد؟

این تابع در گزارش‌گیری، کنترل مهلت، ثبت رخداد و پاک‌سازی داده‌های زمانی کاربرد دارد. در پروژه سازمانی باید منطقه زمانی، دقت و حجم داده نیز در طراحی بررسی شود.

آیا استفاده از DATEDIFF_BIG هزینه توسعه را کاهش می‌دهد؟

استفاده درست از قابلیت داخلی SQL Server معمولاً کد برنامه را ساده و رفتار را یکپارچه می‌کند. برای Queryهای حساس، بازبینی تخصصی طرح اجرا و ایندکس همچنان ارزشمند است.

تفاوت DATEDIFF_BIG با روش‌های تبدیل دستی چیست؟

تابع داخلی قواعد نوع داده و خطا را شفاف‌تر اعمال می‌کند، در حالی که اتصال رشته یا تبدیل دستی ممکن است به LANGUAGE و DATEFORMAT وابسته شود. انتخاب نهایی به دقت و نسخه SQL Server بستگی دارد.

برای پیاده‌سازی حرفه‌ای DATEDIFF_BIG می‌توان از خدمات مشاوره استفاده کرد؟

بله؛ در مهاجرت داده، طراحی گزارش و بهینه‌سازی Query، بررسی نمونه داده و Execution Plan توسط متخصص SQL Server می‌تواند از خطاهای زمانی پرهزینه جلوگیری کند.

خطای رایج هنگام استفاده از DATEDIFF_BIG چیست؟

ورودی مبهم، نوع مقصد نامتناسب یا عبور از دامنه معتبر از خطاهای رایج است. استفاده از قالب ISO، CAST صریح و تست حالت مرزی راه پیشگیری است.

اثر DATEDIFF_BIG بر Performance چیست؟

محاسبه تابع برای هر ردیف CPU مصرف می‌کند و اگر روی ستون ایندکس‌شده در WHERE قرار گیرد ممکن است Seek را دشوار کند. bigint فضای بیشتری دارد؛ تنها وقتی دامنه واقعاً بزرگ است آن را در خروجی و ایندکس نگه دارید.

Best Practice اصلی برای DATEDIFF_BIG چیست؟

نوع داده مناسب، قرارداد ثابت UTC یا زمان محلی، ورودی صریح و تست NULL را مستند کنید. خروجی را قبل از انتشار با داده واقعی و مرزهای تقویمی کنترل کنید.

DATEDIFF_BIG با کدام نسخه‌های SQL Server سازگار است؟

وضعیت سازگاری این تابع: SQL Server 2016 و جدیدتر. علاوه بر نسخه موتور، Compatibility Level پایگاه داده و نوع مقصد را نیز بررسی کنید.

سؤالات مصاحبه

  1. نوع خروجی DATEDIFF_BIG چیست و تبدیل آن به نوع کم‌دقت‌تر چه اثری دارد؟
  2. رفتار DATEDIFF_BIG با NULL و ورودی خارج از دامنه چگونه است؟
  3. چه زمانی استفاده از DATEDIFF_BIG در WHERE مانع استفاده مؤثر از ایندکس می‌شود؟
  4. برای مستقل کردن نتیجه DATEDIFF_BIG از تنظیمات نشست چه اقداماتی انجام می‌دهید؟
  5. چه تست‌هایی برای مرز ماه، سال کبیسه، UTC و Offset طراحی می‌کنید؟

پاسخ قوی در مصاحبه فقط Syntax را تکرار نمی‌کند؛ باید نوع داده، دقت، حالت مرزی، اثر روی Execution Plan و یک سناریوی واقعی را به هم مرتبط کند. بیان یک نمونه خطا و راه اصلاح آن نشان می‌دهد داوطلب رفتار تابع را در محیط تولید تجربه کرده است.

چک‌لیست نهایی

  • نحو DATEDIFF_BIG(datepart, startdate, enddate) با نوع داده صریح آزمایش شده است.
  • نوع خروجی bigint با ستون مقصد سازگار است.
  • حالت NULL، مرز دامنه و تاریخ کبیسه کنترل شده‌اند.
  • اثر تابع بر Predicate و ایندکس با Execution Plan بررسی شده است.
  • قرارداد UTC، زمان محلی و Offset در مستندات پروژه ثبت شده است.

جمع‌بندی

تابع DATEDIFF_BIG زمانی بیشترین ارزش را دارد که همراه با نوع داده صحیح، ورودی شفاف و تست مرزی استفاده شود. مانند DATEDIFF مرزهای زمانی را می‌شمارد اما bigint برمی‌گرداند و برای بازه‌های بزرگ ایمن‌تر است. ده مثال این مقاله نشان دادند چگونه از کاربرد ساده به گزارش‌گیری و بهینه‌سازی برسیم، بدون آنکه دقت زمانی یا قابلیت استفاده از ایندکس نادیده گرفته شود.

برای مقایسه DATEDIFF_BIG با همه توابع همین گروه، به مقاله مادر توابع تاریخ و زمان SQL Server بازگردید و بر اساس نوع خروجی، دقت و سناریوی پروژه بهترین ابزار را انتخاب کنید.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر

اطلاعات تماس

  • آدرس:اصفهان-خیابان ام کلثوم غربی - بعد خیابان تخم چی - بیست متر بعد از پیتزا ننه شب - کوچه تعمیر گاه سمار زغالی - پلاک 354 - درب مشکی - طبقه هفتم
  • آدرس ایمیل:najafzade@gmail.com
  • وب سایت:http://www.a00b.com/
  • تلفن ثابت:(+98)9131253620
  • تلفن همراه:09131253620