آموزش جامع SQL Server (جلسه ۲۸: توابع تاریخ یا Date – بخش ۲)
1398/04/19 14:40 , میلاد صاحب نظر

آموزش جامع SQL Server (جلسه ۲۸: توابع تاریخ یا Date – بخش ۲)

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

۱- نصب و آشنایی با SQL Server

۱۰-عملگرهای SET وCTEوPIVOT

۱۹-indexها بخش۱

۲۸-توابع تاریخ یا date بخش۲

۲-نوشتن query

۱۱-تغییر داده‌ها

۲۰-indexها بخش۲

۲۹-توابع رشته‌ای بخش۱

۳-محدود کردن ردیف‌ها

۱۲-تعریف داده‌ها بخش۱

۲۱-stored procedureها بخش۱

۳۰- توابع رشته‌ای بخش۲

۴-فیلتر کردن داده‌ها بخش ۱

۱۳-تعریف داده‌ها بخش۲

۲۲- stored procedureها بخش۲

۳۱- توابع رشته‌ای بخش۳

۵-فیلتر کردن داده‌ها بخش۲

۱۴-data typeهای بخش۱

۲۳- stored procedureها بخش۳

۳۲-توابع سیستمی بخش ۱

۶-اتصال جداول بخش۱

۱۵-data typeها بخش۲

۲۴-توابع تعریف شده توسط کاربر

۳۳-توابع سیستمی بخش۲

۷-اتصال جداول بخش۲

۱۶-ویژگی‌ها

۲۵-triggerها

۳۴-window functionها بخش۱

۸-گروه‌بندی داده‌ها

۱۷-expressionها

۲۶-توابع تجمعی

۳۵-window functionها بخش ۲

۹-subquery

۱۸-viewها

۲۷-توابع تاریخ یا date بخش۱

 

 

در جلسه قبل توابع MONTH، DAY، DATEPART، DATENAME، SYSDATETIMEOFFSET، SYSUTCDATETIME، SYSDATETIME، GETDATE، GETUTCDATE، CURRENT_TIMESTAMP و YEAR توضیح داده شدند و برای همه مثال حل شد.

مباحث باقی‌مانده نیز در این جلسه توضیح داده خواهند شد.

با ما همراه باشید.

تابع DATEDIFF در SQL Server

برای محاسبه تفاوت بین دو تاریخ از لحاظ سال، ماه، هفته و غیره از تابع ()DATEDIFF استفاده می‌کنیم:

DATEDIFF( date_part , start_date , end_date)

تابع ()DATEDIFF سه آرگومان می‌پذیرد: start_date، date_part و end_date.

  • Date_part بخشی از تاریخ (مثلاً یک سال، یک ربع سال، یک ماه، یک هفته و غیره) است که می‌خواهید اختلاف بر اساس آن بین start_date و end_date محاسبه شود. می‌توانید بخش‌های تاریخ معتبر و قابل‌قبول را در جدول زیر مشاهده کنید.

  • Start_date و end_date تاریخ‌هایی هستند که باید با هم مقایسه شوند. آن‌ها باید دارای مقادیری از نوع SMALLATETIME، DATETIME2، DATETIMEOFFSET، DATETIME، DATE یا TIME باشند.

جدول زیر لیستی از مقادیر معتبر و قابل‌قبول برای date_part را نشان می‌دهد:

Date_part

اختصارات

سال

yy, yyyy

ربع سال

qq, q

ماه

mm, m

روز از سال

dy, y

روز

dd, d

هفته

wk, ww

ساعت

hh

دقیقه

mi, n

ثانیه

ss, s

میلی ثانیه

ms

میکرو ثانیه

mcs

نانو ثانیه

ns

تابع ()DATEDIFF یک مقدار integer را بازمی‌گرداند که این مقدار نشان دهنده تفاوت بین start_date و end_date است که واحد مشخص کننده نوع این تفاوت توسط Date_part مشخص می‌شود.

اگر نتیجه به دست آمده خارج از بازه اعداد integer باشد (یعنی خارج از بازه 2,147,483,648- الی 2,147,483,647+)، آنگاه تابع ()DATEDIFF ارور می‌دهد. در چنین وضعیتی، باید در عوض از تابع ()DATEDIFF_BIG استفاده کنید.

مثال‌های تابع ()DATEDIFF در SQL Server

اجازه دهید چند مثال استفاده از تابع ()DATEDIFF را حل کنیم تا بهتر آن را درک کنید.

الف) استفاده از تابع ()DATEDIFF برای مقایسه تفاوت‌های بین دو مقدار تاریخ

این مثال از تابع ()DATEDIFF برای مقایسه تفاوت بین دو تاریخ که دارای بخش‌های مختلفی از تاریخ هستند، استفاده می‌کند:

DECLARE 
    @start_dt DATETIME2= '2019-12-31 23:59:59.9999999', 
    @end_dt DATETIME2= '2020-01-01 00:00:00.0000000';
 
SELECT 
    DATEDIFF(year, @start_dt, @end_dt) diff_in_year, 
    DATEDIFF(quarter, @start_dt, @end_dt) diff_in_quarter, 
    DATEDIFF(month, @start_dt, @end_dt) diff_in_month, 
    DATEDIFF(dayofyear, @start_dt, @end_dt) diff_in_dayofyear, 
    DATEDIFF(day, @start_dt, @end_dt) diff_in_day, 
    DATEDIFF(week, @start_dt, @end_dt) diff_in_week, 
    DATEDIFF(hour, @start_dt, @end_dt) diff_in_hour, 
    DATEDIFF(minute, @start_dt, @end_dt) diff_in_minute, 
    DATEDIFF(second, @start_dt, @end_dt) diff_in_second, 
    DATEDIFF(millisecond, @start_dt, @end_dt) diff_in_millisecond;

خروجی به این شکل است:

نتایج

ب) مثال استفاده از تابع ()DATEDIFF همراه با ستون جدول

مثال زیر از تابع ()DATEDIFF برای مقایسه تاریخ دریافت درخواستی با تاریخ ارسال (به روز) استفاده کرده و نتیجه‌ای که بازمی‌گرداند بیان می‌کند که آیا سفارش به موقع تحویل داده شده یا خیر.

SELECT
    order_id, 
    required_date, 
    shipped_date,
    CASE
        WHEN DATEDIFF(day, required_date, shipped_date) < 0
        THEN 'Late'
        ELSE 'OnTime'
    END shipment
FROM 
    sales.orders
WHERE 
    shipped_date IS NOT NULL
ORDER BY 
    required_date;

خروجی به این ترتیب است:

نتایج

به این ترتیب، چگونگی استفاده از تابع ()DATEDIFF برای مقایسه تفاوت بین دو مقدار تاریخ را آموختید.

تابع DATEADD در SQL Server

تابع ()DATEADD یک عدد به یک بخش خاص از تاریخ یک مقدار تاریخ ورودی اضافه می‌کند و مقدار اصلاح شده را بازمی‌گرداند.

کد زیر syntax تابع ()DATEADD را نشان می‌دهد:

DATEADD (date_part , value , input_date ) 

تابع ()DATEADD سه آرگومان می‌پذیرد:

  • Date_part بخشی از تاریخ است که تابع ()DATEADD به آن value اضافه می‌کند. اگر value یک مقدار اعشاری یا float باشد، آنگاه تابع ()DATEADD بخش اعشاری را نادیده می‌گیرد. در چنین وضعیتی، تابع عدد را گرد نمی‌کند.

  • Input_date یک تاریخ ورودی یا یک عبارت است که می‌تواند یک مقدار با نوع SMALLATETIME، DATETIME2، DATETIMEOFFSET، DATETIME، DATE یا TIME باشد.

جدول زیر مقادیر معتبر و قابل‌قبول date_part را نمایش می‌دهد:

Date_part

اختصارات

سال

yy, yyyy

ربع سال

qq, q

ماه

mm, m

روز از سال

dy, y

روز

dd, d

هفته

wk, ww

ساعت

hh

دقیقه

mi, n

ثانیه

ss, s

میلی ثانیه

ms

میکرو ثانیه

mcs

نانو ثانیه

ns

تابع ()DATEADD بعد از اضافه کردن value به date_part، یک مقدار تاریخ جدید را بازمی‌گرداند.

مثال‌های تابع ()DATEADD در SQL Server

اجازه دهید چند مثال برای استفاده از تابع ()DATEADD حل کنیم.

اضافه کردن 1 ثانیه به 23:59:59 31-12-2018

SELECT 
    DATEADD(second, 1, '2018-12-31 23:59:59') result;

خروجی به این شکل است:

result
-----------------------
2019-01-01 00:00:00.000
 
(1 row affected)

اضافه کردن 1 روز به 00:00:00 31-12-2018

SELECT 
    DATEADD(day, 1, '2018-12-31 23:59:59') result;

خروجی:

result
-----------------------
2019-01-01 23:59:59.000
 
(1 row affected)

این مثال از تابع ()DATEADD برای محاسبه تاریخ ارسال تخمینی بر اساس تاریخ سفارش، استفاده می‌کند:

SELECT 
    order_id, 
    customer_id, 
    order_date,
    DATEADD(day, 2, order_date) estimated_shipped_date
FROM 
    sales.orders
WHERE 
    shipped_date IS NULL
ORDER BY 
    estimated_shipped_date DESC;

تصویر زیر، بخشی از خروجی را نمایش می‌دهد:

نتایج

مثال‌های کار با ماه

اگر یک رقم ماه به یک تاریخ اضافه کنید و مقدار روز تاریخ به دست آمده وجود نداشته باشد، آنگاه تابع ()DATEADD آخرین روز ماه بازگشتی را بازمی‌گرداند.

به مثال زیر توجه کنید:

SELECT 
    DATEADD(month, 4, '2019-05-31') AS result;

در این مثال، مقدار ماه از تاریخ بازگشتی، ماه سپتامبر است. به هر حال، روز 31 در ماه سپتامبر وجود ندارد، از این رو، تابع ()DATEADD آخرین روز ماه سپتامبر (یعنی 30) را به عنوان مقدار روز برای تاریخ بازگشتی نمایش می‌دهد:

result
-----------------------
2019-09-30 00:00:00.000
 
(1 row affected)

توجه کنید که query زیر نیز همان نتیجه بالا را بازمی‌گرداند:

SELECT 
    DATEADD(month,4,'2019-05-30') AS result;

خروجی:

result
-----------------------
2019-09-30 00:00:00.000
 
(1 row affected)

به این صورت، چگونگی استفاده از تابع ()DATEADD برای اضافه کردن یک مقدار خاص به بخشی از یک تاریخ را آموختید.

تابع EOMONTH در SQL Server

تابع ()EOMONTH آخرین روز ماه یک تاریخ خاص را همراه با یک offset اختیاری، بازمی‌گرداند.

کد زیر syntax تابع ()EOMONTH را نشان می‌دهد:

EOMONTH(start_date [, offset] );

تابع ()EOMONTH دو آرگومان می‌پذیرد:

  • Start_date یک عبارت تاریخ است که مقدار داخل آن نیز یک تاریخ است. تابع ()EOMONTH آخرین روز ماه را برای این تاریخ بازمی‌گرداند.

  • Offset یک integer است که عدد ماه‌هایی که باید به Start_date اضافه شوند را مشخص می‌کند.

اگر نتیجه اضافه شدن offset به start_date یک مقدار غیر معتبر یا غیر قابل‌قبول باشد، آنگاه تابع ()EOMONTH ارور می‌دهد.

مثال‌های ()EOMONTH در SQL Server

اجازه دهید چند مثال برای استفاده از تابع ()EOMONTH حل کنیم.

الف) استفاده از تابع ()EOMONTH برای یک تاریخ

این مثال از تابع ()EOMONTH برای بازگرداندن آخرین روز ماه برای تاریخ 15-02-2019 استفاده می‌کند:

SELECT 
    EOMONTH('2019-02-15') end_of_month_feb2019;

خروجی به این شکل است:

end_of_month_feb2019
--------------------
2019-02-28
 
(1 row affected)

اگر تاریخ یک سال کبیسه را به تابع ()EOMONTH بدهید، باز هم مقدار صحیح را بازمی‌گرداند:

SELECT
    EOMONTH('2020-02-09') end_of_month_feb2020;

خروجی به این صورت است:

end_of_month_feb2020
--------------------
2020-02-29
 
(1 row affected)

همان‌طور که به وضوح در خروجی مشاهده می‌کنید، آخرین روز ماه فوریه 2019 روز 29ام است، نه 28ام.

ب) استفاده از تابع ()EOMONTH برای به دست آوردن تداد روز‌ها در یک ماه خاص

برای به دست آوردن تعداد روزهای یک ماه خاص، مراحل زیر را انجام دهید:

  • ابتدا، از تابع ()EOMONTH برای به دست آوردن آخرین روز ماه استفاده کنید.

  • سپس، آخرین روز ماه را به تابع ()DAY بفرستید.

این مثال تعداد روزهای ماه فوریه سال 2018 را بازمی‌گرداند:

SELECT 
    DAY(EOMONTH('2020-02-09')) days;

خروجی به این شکل است:

days
-----------
29

برای به دست آوردن تعداد روزها در ماه جاری، می‌توانید از کد زیر استفاده کنید:

SELECT 
    DAY(EOMONTH(GETDATE()));
پ) مثال استفاده از تابع ()EOMONTH با یک offset

مثال زیر از تابع ()EOMONTH همراه با یک offset دو ماهه استفاده می‌کند:

SELECT 
    EOMONTH('2019-02-15', 2) eomonth_next_2_months;

خروجی به شکل زیر است:

eomonth_next_2_months
---------------------
2019-04-30
 
(1 row affected)

به این شکل، چگونگی استفاده از تابع ()EOMONTH برای به دست آوردن آخرین روز ماه از یک تاریخ خاص را آموختید.

تابع SWITCHOFFSET در SQL Server

تابع ()SWITCHOFFSET یک DATETIMEOFFSET که از offset منطقه زمانی ذخیره شده به یک offset منطقه زمانی جدید تغییر یافته است را بازمی‌گرداند.

کد زیر syntax تابع ()SWITCHOFFSET را نشان می‌دهد:

SWITCHOFFSET( expression, time_zone )   

تابع ()SWITCHOFFSET دو آرگومان می‌پذیرد:

  • Expression یک عبارت است که می‌تواند یک مقدار DATETIMEOFFSET باشد.

  • Time_zone می‌توانید یک رشته کاراکتر به فرمت TZH:TZM{-|+} یا یک integer علامت‌‌دار از دقیقه‌ها باشد.برای مثال، time_zone می‌تواند به شکل 08:00+,07:00- یا 120 باشد.

تابع ()SWITCHOFFSET یک تابع بسیار مفید و کارآمد برای به روز رسانی مقادیر در یک ستون DATETIMEOFFSET است.

مثال تابع ()SWITCHOFFSET در SQL Server

اجازه دهید مثالی برای استفاده از تابع ()SWITCHOFFSET حل کنیم.

ابتدا، یک جدول جدید ایجاد می‌کنیم که دارای ستون DATETIMEOFFSET باشد:

CREATE TABLE dbo.switchoffset_demo(
    dtz DATETIMEOFFSET
); 

دوم، یک مقدار DATETIMEOFFSET جدید به جدول اضافه می‌کنیم:

INSERT INTO dbo.switchoffset_demo
VALUES('2019-03-06 9:20:00 +07:00'); 

سوم، برای به دست آوردن مقدار جدول dbo.switchoffset_demo یک query می‌نویسیم:

SELECT 
    dtz
FROM 
    dbo.switchoffset_demo;

خروجی به این شکل است:

dtz
----------------------------------
2019-03-06 09:20:00.0000000 +07:00
 
(1 row affected)

چهارم، از تابع ()SWITCHOFFSET برای تغییر منطقه زمانی به 08:00- استفاده می‌کنیم:

SELECT 
    SWITCHOFFSET(dtz, '-08:00') result
FROM 
    dbo.switchoffset_demo; 

خروجی به این ترتیب می‌شود:

result
----------------------------------
2019-03-05 18:20:00.0000000 -08:00
 
(1 row affected)

در نتیجه، چگونگی استفاده از تابع ()SWITCHOFFSET برای تغییر یک منطقه زمانی برای یک مقدار DATETIMEOFFSET را آموختید.

تابع TODATETIMEOFFSET در SQL Server

تابع ()TODATETIMEOFFSET یک مقدار DATETIME2 را به یک مقدار DATETIMEOFFSET ترجمه می‌کند.

کد زیر syntax تابع ()TODATETIMEOFFSET را نشان می‌دهد:

TODATETIMEOFFSET(expression,time_zone)

تابع ()TODATETIMEOFFSET دو آرگومان می‌پذیرد:

  • Expression یک عبارت است که می‌تواند به مقدار DATETIME2 باشد.

  • Time_zone می‌توانید یک integer یا string باشد. اگر از یک integer استفاده کنید، آنگاه time_zone یک offset منطقه زمانی به دقیقه می‌باشد. در غیر این صورت، یک ساعت یا دقیقه به فرم ‘TZH:THM+’ یا ‘TZH:THM-’ است که در آن TZH ساعت و THM دقیقه است. بازه ساعت از 14- تا 14+ است.

مثال‌های تابع ()TODATETIMEOFFSET در SQL Server

بیایید چند مثال برای استفاده از تابع ()TODATETIMEOFFSET حل کنیم.

الف) مثال استفاده از تابع ()TODATETIMEOFFSET برای تغییر offset محدوده زمانی یک تاریخ و زمان

این مثال، offset منطقه یک تاریخ و زمان را به منطقه 08:00- تغییر می‌دهد.

SELECT
    TODATETIMEOFFSET (
        '2019-03-06 07:43:58',
        '-08:00'
    ) result;

خروجی به این ترتیب است:

result
----------------------------------
2019-03-06 07:43:58.0000000 -08:00
 
(1 row affected)
ب) مثال استفاده از تابع ()TODATETIMEOFFSET برای تغییر offset محدوده زمانی به دقیقه

این مثال، محدوده زمانی فعلی را به 180- دقیقه تغییر می‌دهد:

SELECT 
    TODATETIMEOFFSET (GETDATE(), -180) result;

خروجی به این شکل است:

result
----------------------------------
2019-03-06 08:34:32.087 -03:00
 
(1 row affected)
پ) مثال استفاده از تابع ()TODATETIMEOFFSET برای اضافه کردن یک offset منطقه زمانی ساعت به تاریخ و زمان فعلی

مثال زیر یک offset منطقه زمانی 12 ساعته را به تاریخ و زمان ’09:55:00 06-03-2019’ اضافه می‌کند:

SELECT 
    TODATETIMEOFFSET (
        '2019-03-06 09:55:00', 
        '+13:00') 
    result;

خروجی به این ترتیب است:

result
----------------------------------
2019-03-06 09:55:00.0000000 +13:00
 
(1 row affected)

در نتیجه، چگونگی استفاده از تابع ()TODATETIMEOFFSET برای تبدیل یک مقدار DATETIME2 به یک مقدار DATETIMEOFFSET را نیز آموختید.

تابع DATEFROMPARTS در SQL Server

تابع ()DATEFROMPARTS یک مقدار DATE بازمی‌گرداند که متناظر با مقادیر سال، ماه و روز است.

کد زیر، syntax تابع ()DATEFROMPARTS را نمایش می‌دهد:

DATEFROMPARTS(year, month, day)

تابع ()DATEFROMPARTS سه آرگومان می‌پذیرد:

  • Year یک عبارت integer است که از نوع سال است.

  • Month یک عبارت integer است که مقدار آن یک ماه از بازه 1 تا 12 است.

  • Day یک عبارت integer است که یک روز را از بازه 1 تا 31 مشخص می‌کند.

تابع ()DATEFROMPARTS یک مقدار DATE بازمی‌گرداند. اگر هر کدام از آرگومان‌ها NULL باشند، تابع مقدار NULL بازمی‌گرداند.

مثال‌های تابع ()DATEFROMPARTS در SQL Server

اجازه دهید چند مثال برای استفاده از تابع ()DATEFROMPARTS حل کنیم.

الف) مثال استفاده از تابع ()DATEFROMPARTS برای بازگرداندن یک تاریخ

این مثال از تابع ()DATEFROMPARTS برای ساخت یک تاریخ متشکل از مقادیر سال، ماه و روز استفاده می‌کند:

SELECT 
    DATEFROMPARTS(2020,12,31) a_date;

خروجی به این شکل است:

a_date
----------
2020-12-31
 
(1 row affected)
ب) مثال استفاده از تابع ()DATEFROMPARTS همراه با مقدار NULL

مثال زیر مقدار NULL بازمی‌گرداند، چون آرگومان ماه برابر با NULL است:

SELECT 
    DATEFROMPARTS(2020,null,31) a_date;

خروجی به این صورت است:

a_date
----------
NULL
 
(1 row affected)
پ) مثال استفاده از تابع ()DATEFROMPARTS همراه با آرگومان‌های خارج از بازه

این مثال آرگومان‌های غیر معتبر و غیر قابل‌قبول را به تابع ()DATEFROMPARTS ارسال می‌کند که در نتیجه سیستم ارور می‌دهد:

SELECT 
    DATEFROMPARTS(2020,20,-1) a_date;

خط زیر، پیغام ارور را نشان می‌دهد:

Cannot construct data type date, some of the arguments have values which are not valid.

به این شکل، چگونگی ساخت یک مقدار DATE از بخش‌های سال، ماه و روز با استفاده از تابع ()DATEFROMPARTS را آموختید.

تابع DATETIME2FROMPARTS در SQL Server

تابع ()DATETIME2FROMPARTS یک مقدار تاریخ بازمی‌گرداند که از مقادیر سال، ماه، روز، ساعت، دقیقه، ثانیه، اعشار و دقت‌ تشکیل شده است. در واقع این تابع یک مقدار DATETIME2 ایجاد می‌کند.

کد زیر، syntax تابع ()DATETIME2FROMPARTS را نشان می‌دهد:

DATETIME2FROMPARTS ( year, month, day, hour, minute, seconds, fractions, precision )  

تابع ()DATETIME2FROMPARTS هشت آرگومان می‌پذیرد:

  • Year یک عبارت integer است که از نوع سال است.

  • Month یک عبارت integer است که از نوع ماه و در بازه 1 تا 12 است.

  • Day یک عبارت integer است که یک روز از بازه 1 تا 31 را مشخص می‌کند.

  • Hour یک عبارت integer است که ساعت را مشخص می‌کند.

  • Minute یک عبارت integer است که دقیقه را مشخص می‌کند.

  • Seconds یک عبارت integer است که ثانیه‌ها را مشخص می‌کند.

  • Fractions یک عبارت integer است که اعداد قسمت اعشار را نمایش می‌دهد.

  • Precision یک عبارت integer است که دقت مقدار DATETIME2 را مشخص می‌کند.

تابع ()DATETIME2FROMPARTS یک مقدار از نوع DATETIME2 بازمی‌گرداند. اگر هر کدام از آرگومان‌های بالا NULL باشند، تابع مقدار NULL را بازمی‌گرداند.

اگر یک آرگومان دارای یک مقدار غیر معتبر باشد، تابع ()DATETIME2FROMPARTS ارور می‌دهد.

مثال‌های تابع ()DATETIME2FROMPARTS در SQL Server

اجازه دهید چند مثال برای استفاده از تابع ()DATETIME2FROMPARTS حل کنیم.

الف) مثال استفاده از تابع ()DATETIME2FROMPARTS برای بازگرداندن یک DATETIME2

مثال زیر از تابع ()DATETIME2FROMPARTS برای ساخت یک DATETIME2 متشکل از سال، ماه، روز، ساعت، دقیق، ثانیه، اعشار و دقت استفاده می‌کند:

SELECT 
    DATETIME2FROMPARTS ( 2020, 12, 31, 11, 59, 59, 0, 0 ) result;  

خروجی به این ترتیب است:

result
---------------------------
2020-12-31 11:59:59
 
(1 row affected)
ب) مثال استفاده از تابع ()DATETIME2FROMPARTS همراه با آرگومان‌های NULL

این مثال مقدار NULL را بازمی‌گرداند، چون آرگومان month برابر با NULL است:

SELECT 
    DATETIME2FROMPARTS(2020, NULL, 31, 11, 59, 59, 0, 0) result;

خروجی به این شکل است:

result
---------------------------
NULL
 
(1 row affected)
پ) مثال استفاده از تابع ()DATETIME2FROMPARTS با مقادیر غیر معتبر در آرگومان‌ها

مثال زیر آرگومان‌های غیر معتبر را به تابع ()DATETIME2FROMPARTS ارسال می‌کند که در نتیجه سیستم ارور می‌دهد:

SELECT 
    DATETIME2FROMPARTS(2020, 13, 31, 11, 59, 59, 0, 0) result;

پیغام ارور به این صورت است:

Cannot construct data type datetime2, some of the arguments have values which are not valid.

به این ترتیب، چگونگی استفاده از تابع ()DATETIME2FROMPARTS برای ساخت یک مقدار DATETIME2 از اجزای تشکیل‌دهنده آن یعنی سال، ماه، روز، ساعت، دقیقه، ثانیه، اعشار و دقت را آموختید.

تابع DATETIMEOFFSETFROMPARTS در SQL Server

تابع ()DATETIMEOFFSETFROMPARTS  یک مقدار DATETIMEOFFSET از تاریخ و زمان مشخص شده می‌سازد.

کد زیر، syntax تابع ()DATETIMEOFFSETFROMPARTS را نشان می‌دهد:

DATETIMEOFFSETFROMPARTS ( year, month, day, hour, minute, seconds, fractions, hour_offset, minute_offset, precision )  

تابع ()DATETIMEOFFSETFROMPARTS آرگومان‌های زیر را می‌پذیرد:

  • Year یک عبارت integer است که از نوع سال است.

  • Month یک عبارت integer است که از نوع ماه و در بازه 1 تا 12 است.

  • Day یک عبارت integer است که یک روز از بازه 1 تا 31 را مشخص می‌کند.

  • Hour یک عبارت integer است که ساعت را مشخص می‌کند.

  • Minute یک عبارت integer است که دقیقه را مشخص می‌کند.

  • Seconds یک عبارت integer است که ثانیه‌ها را مشخص می‌کند.

  • Fractions یک عبارت integer است که ثانیه‌های قسمت اعشار را نمایش می‌دهد.

  • Hour_offset یک عبارت integer است که بخش ساعت offset منطقه زمانی را مشخص می‌کند.

  • Minute_offset یک عبارت integer است که بخش دقیقه از offset منطقه زمانی را مشخص می‌کند.

  • Precision یک عبارت integer است که دقت مقدار DATETIMEOFFSET را مشخص می‌کند.

مثال‌های تابع ()DATETIMEOFFSETFROMPARTS در SQL Server

بیایید چند مثال برای استفاده از تابع ()DATETIMEOFFSETFROMPARTS حل کنیم.

الف) مثال استفاده از تابع ()DATETIMEOFFSETFROMPARTS برای بازگرداندن یک DATETIMEOFFSET

این مثال از تابع ()DATETIMEOFFSETFROMPARTS برای ساخت یک DATETIMEOFFSET از آرگومان‌های تاریخ و زمان استفاده می‌کند:

SELECT 
    DATETIMEOFFSETFROMPARTS(2020, 11, 12, 20, 35, 30, 5000, 10, 30, 4) Result;

خروجی:

Result
----------------------------------
2020-11-12 20:35:30.5000 +10:30
 
(1 row affected)
ب) مثال استفاده از تابع ()DATETIMEOFFSETFROMPARTS با آرگومان‌های NULL

مثال زیر مقدار NULL بازمی‌گرداند، چون آرگومان year برابر با NULL است:

SELECT 
    DATETIMEOFFSETFROMPARTS(NULL, 11, 12, 20, 35, 30, 5000, 10, 30, 4) Result;

خروجی:

Result
---------------------------
NULL
 
(1 row affected)
پ) مثال استفاده از تابع ()DATETIMEOFFSETFROMPARTS با آرگومان‌های غیر معتبر

این مثال از آرگومان‌های غیر معتبر استفاده می‌کند، که باعث می‌شوند تابع ()DATETIMEOFFSETFROMPARTS ارور بدهد:

SELECT 
    DATETIMEOFFSETFROMPARTS(2020, 19, 14, 20, 35, 30, 5000, 10, 30, 4) Result;

پیغام ارور به این شرح است:

Cannot construct data type datetimeoffset, some of the arguments have values which are not valid.

به این صورت،، چگونگی استفاده از تابع ()DATETIMEOFFSETFROMPARTS برای ساخت یک مقدار DATETIMEOFFSET از آرگومان‌های تاریخ و زمان مشخص شده را نیز آموختید.

تابع TIMEFROMPARTS در SQL Server

تابع ()TIMEFROMPARTS یک مقدار زمان کاملاً مقداردهی اولیه شده را بازمی‌گرداند. این تابع به ۵ آرگومان نیاز دارد که در syntax زیر مشاهده می‌کنید:

TIMEFROMPARTS ( hour, minute, seconds, fractions, precision )  

در این syntax:

  • Hour – ساعت را مشخص می‌کند.

  • Minute – دقیقه را مشخص می‌کند.

  • Seconds – ثانیه‌ها را مشخص می‌کند.

  • Fractions – اعشار را مشخص می‌کند.

  • Precision – دقت مقدار time را مشخص می‌کند. دقت نمی‌تواند null باشد. اگر null باشد، تابع ارور می‌دهد.

تابع ()TIMEFROMPARTS یک مقدار از نوع (time(precision را بازمی‌گرداند.

مثال تابع ()TIMEFROMPARTS در SQL Server

اجازه دهید چند مثال برای استفاده از تابع ()TIMEFROMPARTS حل کنیم.

الف) مثال استفاده از تابع ()TIMEFROMPARTS برای بازگرداندن یک زمان بدون ثانیه‌های اعشار

مثال زیر، چگونگی استفاده از تابع ()TIMEFROMPARTS برای بازگرداندن یک زمان بدون اعشار را نشان می‌دهد:

SELECT 
    TIMEFROMPARTS(23, 59, 59, 0, 0) AS Time;

خروجی عبارت است از:

Time
----------------
23:59:59
 
(1 row affected)
ب) مثال استفاده از تابع ()TIMEFROMPARTS برای بازگرداندن یک زمان با ثانیه‌های اعشار

این مثال، چگونگی استفاده از تابع ()TIMEFROMPARTS با پارامترهای اعشار و دقت را نشان می‌دهد:

SELECT 
    TIMEFROMPARTS(06, 30, 15, 5, 2) Time;

خروجی به این شکل است:

Time
----------------
06:30:15.05
 
(1 row affected)

در این مثال، وقتی fractions دارای مقدار ۵ و precision دارای مقدار ۲ باشند، آنگاه مقدار fractions نشان دهنده 5/100 یا 0.05 از یک ثانیه است.

به این شکل، چگونگی استفاده از تابع ()TIMEFROMPARTS برای بازگرداندن یک مقدار زمان را نیز آموختید.

تابع ISDATE در SQL Server

تابع ()ISDATE یک آرگومان می‌پذیرد و اگر آرگومان یک مقدار TIME، DATE یا DATETIME معتبر باشد، آنگاه مقدار 1 را بازمی‌گرداند، در غیر این صورت مقدار 0 را بازمی‌گرداند.

ISDATE(expression)

عبارت یک رشته حروف یا یک عبارت است که می‌تواند از نوع رشته باشد. طول آن باید کمتر از 4000 کاراکتر باشد.

عبارت نیز می‌تواند یک مقدار DATE یا TIME باشد، اما نمی‌تواند یک مقدار از نوع  DATETIME یا SMALLDATETIME باشد.

اگر عبارت یک مقدار DATETIME2 باشد،ع تابع مقدار 0 را بازمی‌گرداند.

توجه کنید که بازه داده‌های DATETIME از 01-01-1753 تا 31-12-9999 است، در حالی که بازه داده‌های DATE از 01-001-0001 تا 31-12-9999 است.

مثال‌های تابع ()ISDATE در SQL Server

اجازه دهید چند مثال برای استفاده از تابع ()ISDATE حل کنیم.

الف) مثال استفاده از تابع ()ISDATE برای بررسی یک عبارت تاریخ معتبر

این مثال از تابع ()ISDATE برای تست اینکه آیا یک رشته، یک داده DATE معتبر هست یا نه استفاده می‌کند:

SELECT 
    ISDATE('2020-06-15') is_date

خروجی عبارت است از:

is_date
-----------
1
 
(1 row affected)

این مثال را ببینید:

SELECT 
    ISDATE('2020-15-06') is_date

خروجی به این شکل است:

is_date
-----------
0
 
(1 row affected)

این تابع ()ISDATE بستگی به SET LANGUAGE، SET DATEFORMAT و زبان پیش‌فرض SQL Server دارد.

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

DBCC useroptions

تنظیمات زبان فعلی us_english است. اگر زبان را به british تغییر دهید:

SET LANGUAGE british;

آنگاه تابع ()ISDATE نتیجه متفاوتی برای مثال زیر بازمی‌گرداند:

SELECT 
    ISDATE('2020-15-06') is_date

رشته ‘16-15-2020’ حالا به عنوان یک تاریخ معتبر در نظر گرفته می‌شود:

is_date
-----------
1
 
(1 row affected)  
ب) مثال استفاده از تابع ()ISDATE برای بررسی اعتبار یک عبارت datetime

مثال زیر، از تابع ()ISDATE برای بررسی اینکه آیا عبارت یک مقدار DATETIME معتبر هست یا نه، استفاده می‌کند:

SELECT 
    ISDATE('2020-12-05 11:20:30') is_date

خروجی به این شکل است:

is_date
-----------
1
 
(1 row affected)

به این صورت، چگونگی استفاده از تابع ()ISDATE برای بررسی اینکه آیا یک عبارت از نوع TIME، DATE یا DATETIME معتبر هست یا نه را نیز آموختید.

خلاصه

در دو جلسه اخیر، مبحث توابع تاریخ یا Date را به صورت مثال محور بررسی کردیم.

در این قسمت توابع TIMEFROMPARTS، DATETIMEOFFSETFROMPARTS، DATEIME2FROMPARTS، DATEFROMPARTS، TODATETIMEOFFSET، SWITCHOFFSET، EOMONTH، DATEADD، DATEDIFF و ISDATE مورد بررسی قرار گرفتند.

در جلسه آینده راجع به توابع رشته یا string صحبت خواهیم کرد.

با MUG همراه باشید!

منبع: sqlservertutorial

 مطالب مرتبط

۱۳ دستور مهم SQL که هر برنامه‌نویس باید بداند
چگونه از حملات نفوذ کننده به SQL جلوگیری کنیم؟
 طبقه بندی زبان های برنامه نویسی
روش‌های هوشمندانه برای استفاده از "تلفیق" در SQL
 LINQ(زبان جستجوی یکپارچه)
برنامه نویسی شیءگرا چیست؟

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامع SQL Server (جلسه ۱۲)
آموزش جامع SQL Server (جلسه ۱۲)

دستور UPDATE در SQL Server برای تغییر داده‌های موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

آموزش جامع SQL Server (جلسه ۱۵)
آموزش جامع SQL Server (جلسه ۱۵)

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفاده‌ای ندارد را حذف کنید. برای ...

آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)
آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...

آخرین دیدگاه ها

دیدگاه خود را درباره این پست بنویسید

فرم ارسال نظرات