آموزش جامع توابع تاریخ و زمان در 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);
| مثال | خروجی نمونه |
|---|
| 3 | 2026-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;
| مثال | خروجی نمونه |
|---|
| 4 | 2026-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 یا قابلیتهای جدید مسیر جایگزین نسخه قدیمی تعریف کنید.
سؤالات مصاحبه
- تفاوت datetime، datetime2 و datetimeoffset را با یک سناریوی واقعی توضیح دهید.
- چرا DATEDIFF تعداد مرزهای عبورشده را میشمارد و این موضوع چه نتیجهای دارد؟
- چگونه Query مربوط به ماه خاص را SARGable مینویسید؟
- تفاوت TODATETIMEOFFSET و SWITCHOFFSET چیست؟
- وابستگی DATENAME، DATEPART و ISDATE به تنظیمات نشست را چگونه مدیریت میکنید؟
در پاسخ مصاحبه، Syntax کافی نیست. درباره نوع داده، دقت، UTC، Offset، مرز نیمهباز، Execution Plan و تست سال کبیسه صحبت کنید تا درک عملی شما از مسئله روشن شود.
جمعبندی و لینک آموزش توابع
توابع تاریخ و زمان زمانی قابل اعتمادند که در کنار قرارداد زمانی روشن، نوع داده مناسب، ورودی صریح و Query قابل ایندکس استفاده شوند. ابتدا مشخص کنید با یک روز تقویمی، ساعت محلی، لحظه UTC یا لحظه همراه Offset سروکار دارید؛ سپس تابعی را انتخاب کنید که همان مفهوم را بدون تبدیل پنهان بیان کند.
برای هر تابع، مقاله مستقل شامل نحو، پارامترها، ده مثال، خطاها، Performance، FAQ و سؤالهای مصاحبه آماده شده است. با اجرای مثالها روی نسخه SQL Server خود و مشاهده نوع خروجی، نتیجه را پیش از استفاده در داده تولیدی تثبیت کنید.