آموزش توابع تاریخ و زمان SQL Server از پایه تا پیشرفته

آموزش جامع توابع تاریخ و زمان در SQL Server

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

نظرات 0

آموزش جامع توابع تاریخ و زمان در SQL Server

مقدمه و مسیر یادگیری

تاریخ و زمان در SQL Server فقط یک مقدار برای نمایش نیست؛ مبنای مرتب‌سازی رخدادها، اجرای Job، محاسبه مهلت، گزارش مالی، کنترل SLA و هماهنگی سامانه‌های چندمنطقه‌ای است. خطایی کوچک در انتخاب نوع داده یا منطقه زمانی می‌تواند باعث ثبت سفارش در روز نادرست، دوباره‌کاری گزارش یا از دست رفتن امکان استفاده از ایندکس شود.

SQL Server چند نوع داده زمانی ارائه می‌کند. date فقط روز تقویمی، time فقط ساعت، datetime نوع قدیمی با دامنه و دقت محدود، smalldatetime مقدار دقیقه‌ای، datetime2 دامنه و دقت بهتر، و datetimeoffset زمان را همراه Offset ذخیره می‌کند. انتخاب نوع باید از نیاز کسب‌وکار آغاز شود؛ ذخیره کسر ثانیه یا Offset وقتی مصرف‌کننده‌ای ندارد هزینه اضافی ایجاد می‌کند و حذف آن در سامانه حسابرسی نیز خطرناک است.

در سامانه توزیع‌شده معمولاً ثبت لحظه رخداد بر پایه UTC و تبدیل برای نمایش محلی رویکردی قابل اتکاست. با این حال Offset ثابت نام منطقه زمانی نیست و قواعد تغییر ساعت فصلی را به تنهایی مدل نمی‌کند. اگر زمان محلی اعلام‌شده کاربر اهمیت حقوقی دارد، UTC، Offset ثبت‌شده و شناسه منطقه زمانی را بر اساس معماری برنامه نگه دارید.

دسترسی سریع

انواع داده، دقت و انتخاب مبنای زمانی

نوع datetime زمان را با افزایش‌های تقریبی ۳٫۳۳ میلی‌ثانیه ذخیره می‌کند و از سال ۱۷۵۳ آغاز می‌شود. datetime2 تا هفت رقم کسر ثانیه و دامنه وسیع‌تری دارد؛ به همین دلیل برای طراحی جدید غالباً انتخاب مناسب‌تری است. smalldatetime تنها تا دقیقه دقت دارد و دامنه آن محدودتر است. datetimeoffset نیز علاوه بر تاریخ و ساعت، Offset نسبت به UTC را نگه می‌دارد.

دقت اسمی نوع داده با دقت واقعی ساعت سیستم یکسان نیست. توابع SYSDATETIME و SYSUTCDATETIME ظرفیت datetime2(7) دارند، اما کیفیت منبع ساعت به سیستم‌عامل وابسته است. برای ترتیب قطعی رخدادهای هم‌زمان، علاوه بر Timestamp یک کلید ترتیبی یا Sequence در نظر بگیرید.

تبدیل ضمنی میان رشته و تاریخ به SET LANGUAGE و SET DATEFORMAT وابسته می‌شود. قالب ISO، توابع FROMPARTS و CAST یا CONVERT صریح، رفتار را قابل‌پیش‌بینی‌تر می‌کنند. برای ورود داده ناسالم نیز TRY_CONVERT با Style مشخص امکان ثبت ردیف نامعتبر را بدون توقف کل Batch فراهم می‌سازد.

دریافت زمان جاری

این گروه ساعت سیستم را با مبنای محلی یا UTC و با دقت‌های متفاوت ارائه می‌کند. انتخاب درست میان datetime، datetime2 و datetimeoffset از حذف دقت یا اطلاعات Offset جلوگیری می‌کند.

تابع CURRENT_TIMESTAMP در SQL Server

زمان محلی جاری نمونه SQL Server را برمی‌گرداند و شکل استاندارد ANSI برای دسترسی به ساعت سیستم است. دقت عملی آن با GETDATE یکسان و در حد datetime است. آموزش کامل تابع CURRENT_TIMESTAMP با ده مثال عملی

تابع GETDATE در SQL Server

تاریخ و ساعت محلی سیستم‌عاملی را که SQL Server روی آن اجرا می‌شود برمی‌گرداند. تقریباً ۳٫۳۳ میلی‌ثانیه دقت ذخیره‌سازی datetime دارد. آموزش کامل تابع GETDATE با ده مثال عملی

تابع GETUTCDATE در SQL Server

زمان جاری را بر پایه UTC برمی‌گرداند و برای ثبت رخدادهای چندمنطقه‌ای مفید است. نوع خروجی datetime است؛ برای دقت بیشتر SYSUTCDATETIME مناسب‌تر است. آموزش کامل تابع GETUTCDATE با ده مثال عملی

تابع SYSDATETIME در SQL Server

تاریخ و ساعت محلی سرور را با نوع datetime2 و دقت کسری بالاتر از GETDATE ارائه می‌کند. تا ۱۰۰ نانوثانیه ظرفیت نمایش دارد؛ دقت واقعی به ساعت سیستم بستگی دارد. آموزش کامل تابع SYSDATETIME با ده مثال عملی

تابع SYSDATETIMEOFFSET در SQL Server

زمان محلی سرور را همراه Offset فعلی نسبت به UTC در قالب datetimeoffset برمی‌گرداند. زمان، کسر ثانیه و Offset را هم‌زمان نگهداری می‌کند. آموزش کامل تابع SYSDATETIMEOFFSET با ده مثال عملی

تابع SYSUTCDATETIME در SQL Server

زمان جاری UTC را با نوع datetime2(7) برمی‌گرداند و برای لاگ‌های دقیق توزیع‌شده مناسب است. دقت اسمی ۱۰۰ نانوثانیه و مبنای زمانی UTC دارد. آموزش کامل تابع SYSUTCDATETIME با ده مثال عملی

محاسبه و اختلاف تاریخ

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

تابع DATEADD در SQL Server

یک تعداد صحیح از جزء زمانی مشخص را به تاریخ اضافه یا از آن کم می‌کند. عبور از محدوده نوع مقصد خطای overflow ایجاد می‌کند. آموزش کامل تابع DATEADD با ده مثال عملی

تابع DATEDIFF در SQL Server

تعداد مرزهای datepart عبورشده میان زمان شروع و پایان را به صورت int محاسبه می‌کند. برای بازه‌های بسیار بزرگ ممکن است int سرریز کند. آموزش کامل تابع DATEDIFF با ده مثال عملی

تابع DATEDIFF_BIG در SQL Server

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

تابع EOMONTH در SQL Server

آخرین روز ماه مربوط به تاریخ ورودی را با امکان جابه‌جایی اختیاری ماه محاسبه می‌کند. اگر جابه‌جایی از دامنه date خارج شود خطای overflow رخ می‌دهد. آموزش کامل تابع EOMONTH با ده مثال عملی

تابع DATETRUNC در SQL Server

بخش‌های کوچک‌تر از datepart انتخابی را صفر می‌کند و مرز شروع واحد زمانی را می‌سازد. scale و نوع ورودی در خروجی حفظ می‌شود و nanosecond پشتیبانی نمی‌شود. آموزش کامل تابع DATETRUNC با ده مثال عملی

استخراج اجزای تاریخ

این توابع سال، ماه، روز یا نام متنی جزء تاریخ را استخراج می‌کنند. برای نمایش بسیار مناسب‌اند، اما استفاده مستقیم روی ستون ایندکس‌شده در WHERE همیشه بهترین طرح نیست.

تابع DATENAME در SQL Server

نام متنی یک جزء تاریخ مانند ماه یا روز هفته را بر اساس زبان نشست برمی‌گرداند. خروجی به SET LANGUAGE و تنظیمات نشست وابسته است. آموزش کامل تابع DATENAME با ده مثال عملی

تابع DATEPART در SQL Server

جزء عددی تاریخ یا زمان مانند سال، هفته، ساعت یا Offset را به صورت int استخراج می‌کند. نتیجه week و weekday می‌تواند به SET DATEFIRST وابسته باشد. آموزش کامل تابع DATEPART با ده مثال عملی

تابع DAY در SQL Server

شماره روز ماه را از یک مقدار تاریخ استخراج می‌کند و معادل DATEPART(day, date) است. برای ورودی time خالص، تبدیل ضمنی می‌تواند نتیجه غیرمنتظره ایجاد کند. آموزش کامل تابع DAY با ده مثال عملی

تابع MONTH در SQL Server

شماره ماه بین ۱ تا ۱۲ را از تاریخ استخراج می‌کند و معادل DATEPART(month, date) است. بدون درنظر گرفتن سال، گروه‌بندی صرف بر اساس MONTH داده سال‌های مختلف را مخلوط می‌کند. آموزش کامل تابع MONTH با ده مثال عملی

تابع YEAR در SQL Server

سال میلادی را از مقدار تاریخ استخراج می‌کند و معادل DATEPART(year, date) است. تقویم خروجی میلادی است و تبدیل شمسی را انجام نمی‌دهد. آموزش کامل تابع YEAR با ده مثال عملی

ساخت تاریخ و زمان

خانواده FROMPARTS اجزای عددی را به نوع زمانی معتبر تبدیل می‌کند و خطای داده را زود آشکار می‌سازد. این روش از اتصال رشته و ابهام قالب تاریخ ایمن‌تر است.

تابع DATEFROMPARTS در SQL Server

یک مقدار date معتبر را از سال، ماه و روز عددی می‌سازد و اعتبار اجزا را بررسی می‌کند. اجزای نامعتبر خطا می‌دهند و وجود NULL در هر جزء خروجی NULL می‌سازد. آموزش کامل تابع DATEFROMPARTS با ده مثال عملی

تابع DATETIMEFROMPARTS در SQL Server

مقدار datetime را از اجزای تاریخ، ساعت و میلی‌ثانیه می‌سازد. میلی‌ثانیه باید در بازه معتبر باشد و datetime گردشدگی خاص خود را دارد. آموزش کامل تابع DATETIMEFROMPARTS با ده مثال عملی

تابع SMALLDATETIMEFROMPARTS در SQL Server

مقدار smalldatetime را از سال تا دقیقه می‌سازد و ثانیه را در نوع خروجی نگه نمی‌دارد. دامنه از 1900 تا 2079 و دقت یک دقیقه است. آموزش کامل تابع SMALLDATETIMEFROMPARTS با ده مثال عملی

تابع TIMEFROMPARTS در SQL Server

مقدار time را از ساعت، دقیقه، ثانیه، کسر ثانیه و precision مشخص می‌سازد. معنای fractions به precision وابسته است؛ برای precision برابر ۳، مقدار ۱۲۳ یعنی ۱۲۳ میلی‌ثانیه. آموزش کامل تابع TIMEFROMPARTS با ده مثال عملی

مدیریت Offset

این گروه میان برچسب‌گذاری زمان محلی با یک Offset و تبدیل یک لحظه موجود به Offset دیگر تفاوت می‌گذارد. این تفاوت برای رخدادهای بین‌المللی و حسابرسی حیاتی است.

تابع SWITCHOFFSET در SQL Server

نمایش یک لحظه datetimeoffset را با Offset جدید تغییر می‌دهد، بدون آنکه لحظه متناظر UTC عوض شود. ساعت ظاهری تغییر می‌کند اما نقطه زمانی UTC ثابت می‌ماند. آموزش کامل تابع SWITCHOFFSET با ده مثال عملی

تابع TODATETIMEOFFSET در SQL Server

یک datetime2 بدون Offset را با Offset مشخص برچسب‌گذاری و به datetimeoffset تبدیل می‌کند. لحظه ورودی جابه‌جا نمی‌شود؛ فقط Offset به آن نسبت داده می‌شود. آموزش کامل تابع TODATETIMEOFFSET با ده مثال عملی

اعتبارسنجی

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

تابع ISDATE در SQL Server

بررسی می‌کند که آیا یک عبارت متنی می‌تواند به date، time یا datetime تبدیل شود و مقدار ۱ یا ۰ می‌دهد. نتیجه به LANGUAGE و DATEFORMAT وابسته است و برای datetime2 ظرافت‌های سازگاری دارد. آموزش کامل تابع ISDATE با ده مثال عملی

جدول مقایسه توابع تاریخ و زمان

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

تابعکاربرد اصلینوع خروجی یا نکته مهملینک آموزش کامل
CURRENT_TIMESTAMPزمان محلی جاری نمونه SQL Server را برمی‌گرداند و شکل استاندارد ANSI برای دسترسی به ساعت سیستم است.datetime؛ دقت عملی آن با GETDATE یکسان و در حد datetime است.مطالعه آموزش CURRENT_TIMESTAMP
GETDATEتاریخ و ساعت محلی سیستم‌عاملی را که SQL Server روی آن اجرا می‌شود برمی‌گرداند.datetime؛ تقریباً ۳٫۳۳ میلی‌ثانیه دقت ذخیره‌سازی datetime دارد.مطالعه آموزش GETDATE
GETUTCDATEزمان جاری را بر پایه UTC برمی‌گرداند و برای ثبت رخدادهای چندمنطقه‌ای مفید است.datetime؛ نوع خروجی datetime است؛ برای دقت بیشتر SYSUTCDATETIME مناسب‌تر است.مطالعه آموزش GETUTCDATE
SYSDATETIMEتاریخ و ساعت محلی سرور را با نوع datetime2 و دقت کسری بالاتر از GETDATE ارائه می‌کند.datetime2(7)؛ تا ۱۰۰ نانوثانیه ظرفیت نمایش دارد؛ دقت واقعی به ساعت سیستم بستگی دارد.مطالعه آموزش SYSDATETIME
SYSDATETIMEOFFSETزمان محلی سرور را همراه Offset فعلی نسبت به UTC در قالب datetimeoffset برمی‌گرداند.datetimeoffset(7)؛ زمان، کسر ثانیه و Offset را هم‌زمان نگهداری می‌کند.مطالعه آموزش SYSDATETIMEOFFSET
SYSUTCDATETIMEزمان جاری UTC را با نوع datetime2(7) برمی‌گرداند و برای لاگ‌های دقیق توزیع‌شده مناسب است.datetime2(7)؛ دقت اسمی ۱۰۰ نانوثانیه و مبنای زمانی UTC دارد.مطالعه آموزش SYSUTCDATETIME
DATEADDیک تعداد صحیح از جزء زمانی مشخص را به تاریخ اضافه یا از آن کم می‌کند.پویا و وابسته به نوع آرگومان date؛ عبور از محدوده نوع مقصد خطای overflow ایجاد می‌کند.مطالعه آموزش DATEADD
DATEDIFFتعداد مرزهای datepart عبورشده میان زمان شروع و پایان را به صورت int محاسبه می‌کند.int؛ برای بازه‌های بسیار بزرگ ممکن است int سرریز کند.مطالعه آموزش DATEDIFF
DATEDIFF_BIGمانند DATEDIFF مرزهای زمانی را می‌شمارد اما bigint برمی‌گرداند و برای بازه‌های بزرگ ایمن‌تر است.bigint؛ در واحد nanosecond نیز محدوده نهایی bigint باید رعایت شود.مطالعه آموزش DATEDIFF_BIG
DATENAMEنام متنی یک جزء تاریخ مانند ماه یا روز هفته را بر اساس زبان نشست برمی‌گرداند.nvarchar؛ خروجی به SET LANGUAGE و تنظیمات نشست وابسته است.مطالعه آموزش DATENAME
DATEPARTجزء عددی تاریخ یا زمان مانند سال، هفته، ساعت یا Offset را به صورت int استخراج می‌کند.int؛ نتیجه week و weekday می‌تواند به SET DATEFIRST وابسته باشد.مطالعه آموزش DATEPART
DAYشماره روز ماه را از یک مقدار تاریخ استخراج می‌کند و معادل DATEPART(day, date) است.int؛ برای ورودی time خالص، تبدیل ضمنی می‌تواند نتیجه غیرمنتظره ایجاد کند.مطالعه آموزش DAY
MONTHشماره ماه بین ۱ تا ۱۲ را از تاریخ استخراج می‌کند و معادل DATEPART(month, date) است.int؛ بدون درنظر گرفتن سال، گروه‌بندی صرف بر اساس MONTH داده سال‌های مختلف را مخلوط می‌کند.مطالعه آموزش MONTH
YEARسال میلادی را از مقدار تاریخ استخراج می‌کند و معادل DATEPART(year, date) است.int؛ تقویم خروجی میلادی است و تبدیل شمسی را انجام نمی‌دهد.مطالعه آموزش YEAR
EOMONTHآخرین روز ماه مربوط به تاریخ ورودی را با امکان جابه‌جایی اختیاری ماه محاسبه می‌کند.date؛ اگر جابه‌جایی از دامنه date خارج شود خطای overflow رخ می‌دهد.مطالعه آموزش EOMONTH
DATETRUNCبخش‌های کوچک‌تر از datepart انتخابی را صفر می‌کند و مرز شروع واحد زمانی را می‌سازد.نوع پویا وابسته به ورودی؛ scale و نوع ورودی در خروجی حفظ می‌شود و nanosecond پشتیبانی نمی‌شود.مطالعه آموزش DATETRUNC
DATEFROMPARTSیک مقدار date معتبر را از سال، ماه و روز عددی می‌سازد و اعتبار اجزا را بررسی می‌کند.date؛ اجزای نامعتبر خطا می‌دهند و وجود NULL در هر جزء خروجی NULL می‌سازد.مطالعه آموزش DATEFROMPARTS
DATETIMEFROMPARTSمقدار datetime را از اجزای تاریخ، ساعت و میلی‌ثانیه می‌سازد.datetime؛ میلی‌ثانیه باید در بازه معتبر باشد و datetime گردشدگی خاص خود را دارد.مطالعه آموزش DATETIMEFROMPARTS
SMALLDATETIMEFROMPARTSمقدار smalldatetime را از سال تا دقیقه می‌سازد و ثانیه را در نوع خروجی نگه نمی‌دارد.smalldatetime؛ دامنه از 1900 تا 2079 و دقت یک دقیقه است.مطالعه آموزش SMALLDATETIMEFROMPARTS
TIMEFROMPARTSمقدار time را از ساعت، دقیقه، ثانیه، کسر ثانیه و precision مشخص می‌سازد.time(precision)؛ معنای fractions به precision وابسته است؛ برای precision برابر ۳، مقدار ۱۲۳ یعنی ۱۲۳ میلی‌ثانیه.مطالعه آموزش TIMEFROMPARTS
SWITCHOFFSETنمایش یک لحظه datetimeoffset را با Offset جدید تغییر می‌دهد، بدون آنکه لحظه متناظر UTC عوض شود.datetimeoffset با scale ورودی؛ ساعت ظاهری تغییر می‌کند اما نقطه زمانی UTC ثابت می‌ماند.مطالعه آموزش SWITCHOFFSET
TODATETIMEOFFSETیک datetime2 بدون Offset را با Offset مشخص برچسب‌گذاری و به datetimeoffset تبدیل می‌کند.datetimeoffset با دقت ورودی؛ لحظه ورودی جابه‌جا نمی‌شود؛ فقط Offset به آن نسبت داده می‌شود.مطالعه آموزش TODATETIMEOFFSET
ISDATEبررسی می‌کند که آیا یک عبارت متنی می‌تواند به date، time یا datetime تبدیل شود و مقدار ۱ یا ۰ می‌دهد.int؛ نتیجه به LANGUAGE و DATEFORMAT وابسته است و برای datetime2 ظرافت‌های سازگاری دارد.مطالعه آموزش ISDATE

مثال‌های ترکیبی و کاربردی

مثال 1: ساخت بازه ماه جاری

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

DECLARE @Start date = DATETRUNC(month, CAST(GETDATE() AS date));
DECLARE @End date = DATEADD(month, 1, @Start);
SELECT @Start AS StartDate, @End AS EndDate;
مثالخروجی نمونه
1ابتدای ماه جاری و ابتدای ماه بعد

نکته کاربردی: شرط EventDate بزرگ‌تر یا مساوی Start و کوچک‌تر از End، کسر ثانیه را از قلم نمی‌اندازد.

مثال 2: محاسبه زمان باقی‌مانده SLA

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

DECLARE @CreatedAt datetime2 = DATEADD(hour, -2, SYSUTCDATETIME());
DECLARE @DueAt datetime2 = DATEADD(hour, 4, @CreatedAt);
SELECT @DueAt AS DueAtUtc, DATEDIFF(minute, SYSUTCDATETIME(), @DueAt) AS MinutesRemaining;
مثالخروجی نمونه
2حدود 120 دقیقه باقی‌مانده

نکته کاربردی: همه مقادیر در این سناریو UTC هستند و مقایسه میان مبناهای مختلف رخ نمی‌دهد.

مثال 3: گزارش فروش روزانه

تاریخ هر سفارش از datetime2 جدا و مجموع فروش بر اساس روز محاسبه می‌شود.

DECLARE @Sales TABLE (SoldAt datetime2, Amount decimal(10,2));
INSERT INTO @Sales VALUES ('2026-07-19T09:00:00',100),('2026-07-19T15:00:00',250),('2026-07-20T10:00:00',80);
SELECT CAST(SoldAt AS date) AS SaleDate, SUM(Amount) AS Total
FROM @Sales GROUP BY CAST(SoldAt AS date);
مثالخروجی نمونه
32026-07-19 برابر 350 و 2026-07-20 برابر 80

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

مثال 4: تبدیل لحظه محلی به UTC

ابتدا Offset به زمان محلی نسبت داده و سپس همان لحظه با Offset صفر نمایش داده می‌شود.

DECLARE @Local datetime2 = DATETIME2FROMPARTS(2026,7,19,12,0,0,0,0);
SELECT SWITCHOFFSET(TODATETIMEOFFSET(@Local, '+03:30'), '+00:00') AS UtcMoment;
مثالخروجی نمونه
42026-07-19 08:30:00 +00:00

نکته کاربردی: TODATETIMEOFFSET برچسب می‌زند و SWITCHOFFSET نمایش همان لحظه را تبدیل می‌کند.

مثال 5: کنترل ورودی متنی

ورودی معتبر و نامعتبر با TRY_CONVERT و Style ثابت بررسی می‌شوند.

WITH Inputs(ValueText) AS (SELECT '2026-07-19' UNION ALL SELECT '2026-02-30')
SELECT ValueText, TRY_CONVERT(date, ValueText, 23) AS ParsedDate
FROM Inputs;
مثالخروجی نمونه
5ردیف اول تاریخ معتبر و ردیف دوم NULL

نکته کاربردی: ذخیره متن خام در کنار علت رد شدن، عیب‌یابی فرآیند Import را ساده می‌کند.

مثال 6: کلید فصل و انتهای ماه

DATEPART فصل را استخراج می‌کند و EOMONTH آخرین روز ماه را می‌سازد.

DECLARE @D date = DATEFROMPARTS(2026, 7, 19);
SELECT YEAR(@D) AS CalendarYear, DATEPART(quarter,@D) AS QuarterNo, EOMONTH(@D) AS MonthEnd;
مثالخروجی نمونه
6سال 2026، فصل 3 و انتهای ماه 2026-07-31

نکته کاربردی: در گزارش چندساله، فصل را همراه سال گروه‌بندی کنید تا دوره‌ها مخلوط نشوند.

Performance و طراحی Query

قرار دادن YEAR، MONTH، DAY یا CAST روی ستون EventDate در WHERE می‌تواند Predicate را غیر SARGable کند. به جای آن مرز شروع و پایان را در متغیر بسازید و ستون را مستقیم با این مرزها مقایسه کنید. این الگو شانس Index Seek را افزایش می‌دهد و تخمین تعداد ردیف را برای Optimizer روشن‌تر می‌کند.

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

Actual Execution Plan، STATISTICS IO و STATISTICS TIME معیار تصمیم‌اند. کوتاه‌تر شدن کد الزاماً سریع‌تر شدن آن نیست. نوع داده پارامتر باید با ستون یکسان باشد تا تبدیل ضمنی روی ستون رخ ندهد و ایندکس قابل استفاده بماند.

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

بهترین نوع تاریخ برای طراحی جدید چیست؟

برای بسیاری از سناریوها datetime2 انتخاب متعادل‌تری است، اما date، time یا datetimeoffset باید بر اساس نیاز واقعی انتخاب شوند.

زمان را محلی ذخیره کنیم یا UTC؟

در سامانه چندمنطقه‌ای معمولاً UTC برای لحظه رخداد مناسب است و تبدیل محلی در نمایش انجام می‌شود؛ نیاز حقوقی ممکن است ذخیره Offset و منطقه زمانی را نیز لازم کند.

GETDATE و SYSDATETIME چه تفاوتی دارند؟

GETDATE نوع datetime و SYSDATETIME نوع datetime2(7) برمی‌گرداند؛ دقت مقصد و سازگاری Schema تعیین‌کننده است.

چرا تاریخ رشته‌ای مبهم خطرناک است؟

تفسیر آن به زبان و DATEFORMAT وابسته می‌شود. قالب ISO یا FROMPARTS رفتار را روشن‌تر می‌کند.

چطور ماه جاری را کارا فیلتر کنیم؟

ابتدای ماه و ابتدای ماه بعد را یک‌بار بسازید و ستون را با بازه نیمه‌باز مقایسه کنید.

Offset با Time Zone یکسان است؟

خیر؛ Offset فقط فاصله از UTC است و قواعد تاریخی یا تغییر ساعت فصلی منطقه را نگه نمی‌دارد.

برای وارد کردن داده نامعتبر چه کنیم؟

TRY_CONVERT با Style صریح، ثبت متن خام و گزارش علت رد شدن یک مسیر قابل حسابرسی می‌سازد.

آیا توابع تاریخ باعث کندی می‌شوند؟

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

برای پروژه SQL Server چه زمانی مشاوره مفید است؟

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

سازگاری توابع جدید را چگونه کنترل کنیم؟

نسخه موتور و Compatibility Level را بررسی و برای DATETRUNC یا قابلیت‌های جدید مسیر جایگزین نسخه قدیمی تعریف کنید.

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

  1. تفاوت datetime، datetime2 و datetimeoffset را با یک سناریوی واقعی توضیح دهید.
  2. چرا DATEDIFF تعداد مرزهای عبورشده را می‌شمارد و این موضوع چه نتیجه‌ای دارد؟
  3. چگونه Query مربوط به ماه خاص را SARGable می‌نویسید؟
  4. تفاوت TODATETIMEOFFSET و SWITCHOFFSET چیست؟
  5. وابستگی DATENAME، DATEPART و ISDATE به تنظیمات نشست را چگونه مدیریت می‌کنید؟

در پاسخ مصاحبه، Syntax کافی نیست. درباره نوع داده، دقت، UTC، Offset، مرز نیمه‌باز، Execution Plan و تست سال کبیسه صحبت کنید تا درک عملی شما از مسئله روشن شود.

جمع‌بندی و لینک آموزش توابع

توابع تاریخ و زمان زمانی قابل اعتمادند که در کنار قرارداد زمانی روشن، نوع داده مناسب، ورودی صریح و Query قابل ایندکس استفاده شوند. ابتدا مشخص کنید با یک روز تقویمی، ساعت محلی، لحظه UTC یا لحظه همراه Offset سروکار دارید؛ سپس تابعی را انتخاب کنید که همان مفهوم را بدون تبدیل پنهان بیان کند.

برای هر تابع، مقاله مستقل شامل نحو، پارامترها، ده مثال، خطاها، Performance، FAQ و سؤال‌های مصاحبه آماده شده است. با اجرای مثال‌ها روی نسخه SQL Server خود و مشاهده نوع خروجی، نتیجه را پیش از استفاده در داده تولیدی تثبیت کنید.

 

0 نظر

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

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

حرف 500 حداکثر

اطلاعات تماس

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