خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


استفاده از تابع ()DATEDIFF در SQL Server

استفاده از تابع ()DATEDIFF در SQL Server
در SQL Server می توانید با استفاده از تابع DATEDIFF، تفاوت بین دو تاریخ/زمان را بدست آورید. این تنابع روی عباراتی از نوع time, date, smalldatetime, datetime, datetime2 و datetimeoffset می تواند کار کند.

سیستم یکپارچۀ سازمانی راهکار
در ادامه مطلب با ذکر مثال با نحوه کار و طرز استفاده از تابع DATEDIFF آشنا خواهید شد.


Syntax استفاده از تابع مذکور بصورت زیر می باشد:

DATEDIFF ( datepart , startdate , enddate )

Datepart در واقع عبارتی(روز، ماه، سال و ساعت) است که میخواهید مورد مقایسه قرار گیرد. startdate اولین تاریخ است و enddate تاریخ پایان است.
در مثال زیر، اختلاف بین دو تاریخ بر حسب day در خرویج نمایش داده می شود:

SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;

+----------+
| Result |
|----------|
| 365 |
+----------+

در مثال زیر، دو متغیر تعریف شده و تاریخی مجزا به هر کدام اختصاص داده می شود. سپس از تابع DATEADD برای اضافه کردن 1 یکسال به تاریخ اول استفاده شده است و سپس با استفاده از تابع DATEDIFF برای محاسبه بخش های مختلف تاریخ، استفاده می شود:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 1, @date1);
SELECT
DATEDIFF( year, @date1, @date2 ) AS Years,
DATEDIFF( quarter, @date1, @date2 ) AS Quarters,
DATEDIFF( month, @date1, @date2 ) AS Months,
DATEDIFF( week, @date1, @date2 ) AS Weeks,
DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear,
DATEDIFF( day, @date1, @date2 ) AS Days;

+---------+------------+----------+---------+-------------+--------+
| Years | Quarters | Months | Weeks | DayOfYear | Days |
|---------+------------+----------+---------+-------------+--------|
| 1 | 4 | 12 | 53 | 366 | 366 |
+---------+------------+----------+---------+-------------+--------+

همانطور که گفته شد، قسمت های مختلف زمانی بین تاریخ ها را می توانید با استفاده از تابع مذکور محاسبه کنید. در مثال زیر، اختلاف بین دو بازه زمانی بر حسب ساعت، دقیقه و ثانیه نمایش داده می شود:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1);
SELECT
DATEDIFF( hour, @date1, @date2 ) AS Hours,
DATEDIFF( minute, @date1, @date2 ) AS Minutes,
DATEDIFF( second, @date1, @date2 ) AS Seconds;

+---------+-----------+-----------+
| Hours | Minutes | Seconds |
|---------+-----------+-----------|
| 1 | 60 | 3600 |
+---------+-----------+-----------+

در مثال زیر حتی پا را فراتر می گذاریم و میلی ثانیه ، میکرو ثانیه و نانو ثانیه بین دو بازه زمانی را محاسبه می کنیم.

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1);
SELECT
DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

+----------------+----------------+---------------+
| Milliseconds | Microseconds | Nanoseconds |
|----------------+----------------+---------------|
| 1 | 1000 | 1000000 |
+----------------+----------------+---------------+

ولی اگر در این خصوص بخواهید افراط کنید و مثلا تعداد ثانیه یا میلی ثانیه را در 100 را بخواهید نمایش دهید، خطا دریافت خواهید کرد. خطا به این دلیل رخ می دهد که خروجی تابع DATEDIFF از نوع int می باشد.

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 100, @date1);
SELECT
DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.

اگر واقعا قصد دانستن و پی بردن به اینکه 100 سال چند میلی ثانیه است را دارید، از تابع DATEDIFF_BIG استفاده کنید. این تابع مقادیر بسیار بزرگ را می تواند برگرداند چرا که نوع خروجی آن Bigint می باشد.
خروجی هایی که از DATEDIFF دریافت می کنید، اگر از طرز کار آن مطلع نباشید ممکن است این طور تصور کنید که خروجی اشتباه است(در صورتی که اینطور نیست). برای مثال:

DECLARE
@startdate datetime2 = '2016-01-01 00:00:00.0000000',
@enddate datetime2 = '2016-12-31 23:59:59.9999999';
SELECT
DATEDIFF(day, @startdate, @enddate) Days,
DATEDIFF(year, @startdate, @enddate) Years;

+--------+---------+
| Days | Years |
|--------+---------|
| 365 | 0 |
+--------+---------+

شاید به نظر اشتباه برسد ولی اشتباه نیست.


نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.


دسته بندی مطالب خوش آموز