اگر با دیتابیس کار میکنید، حتماً نیاز دارید گزارشهایی داشته باشید که تاریخها به تاریخ شمسی نمایش داده شوند. متأسفانه توابع تاریخ شمسی به صورت پیشفرض در SQL Server وجود ندارند، اما با روشهای مختلفی میتوان این تبدیل را انجام داد.
در این مقاله، روش پیادهسازی یک تابع تعریف شده توسط کاربر (User Defined Function) برای تبدیل تاریخ میلادی به شمسی و استفاده آن در SQL Server را به شما آموزش میدهیم.
روشهای تبدیل تاریخ میلادی به شمسی در SQL Server
استفاده از تابع FORMAT
تابع FORMAT
در SQL Server به شما امکان میدهد با تنظیم culture روی 'fa-IR'
، تاریخ شمسی را به سادگی نمایش دهید:
DECLARE @today DATE = GETDATE();
SELECT FORMAT(@today, 'yyyy-MM-dd', 'fa-IR') AS PersianDate1,
FORMAT(@today, 'yyyy-MMM', 'fa-IR') AS PersianDate2,
FORMAT(@today, 'yyyy-MM-dd-dddd', 'fa-IR') AS PersianDate3;
این روش سریع و ساده است اما در نسخههای قدیمی SQL Server پشتیبانی نمیشود.
استفاده از جدول تاریخ (DimDate)
در پروژههای هوش تجاری، معمولاً یک جدول تاریخ به نام DimDate
ایجاد میشود که تاریخها را به فرمتهای مختلف (شمسی، میلادی، قمری و …) ذخیره میکند و انعطاف بالایی در گزارشگیری دارد.
ساخت تابع سفارشی تبدیل تاریخ میلادی به شمسی در SQL Server با CLR
پیشنیازها
برای این روش نیاز به Visual Studio و آشنایی با زبان #C دارید. با استفاده از قابلیت CLR Integration در SQL Server میتوانید توابع پیچیدهای مثل تبدیل تاریخ شمسی را پیادهسازی کنید.
پیشنهاد مطالعه: تبدیل تاریخ شمسی به میلادی در SQL Server (آموزش کامل + کد آماده)
مراحل پیادهسازی
- در Visual Studio، یک پروژه جدید از نوع SQL Server Database Project ایجاد کنید.
- با راستکلیک روی پروژه، یک آیتم جدید از نوع User Defined Function اضافه کنید و آن را به نام
JalaliFunction
نامگذاری کنید. - کد زیر را در فایل اضافه کنید:
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Globalization;
public partial class UserDefinedFunctions {
[SqlFunction]
public static SqlString JalaliFunction(DateTime dt) {
string result = "";
if (dt != null) {
PersianCalendar pc = new PersianCalendar();
int year = pc.GetYear(dt);
int month = pc.GetMonth(dt);
int day = pc.GetDayOfMonth(dt);
result = $"{year:0000}/{month:00}/{day:00}";
}
return new SqlString(result);
}
}
- پروژه را Build کنید تا فایل DLL ساخته شود.
- تنظیمات SQL Server را برای فعالسازی CLR اجرا کنید:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
EXEC sp_configure 'clr strict security', 0;
GO
RECONFIGURE;
GO
- فایل DLL ساختهشده را به SQL Server اضافه کنید:
CREATE ASSEMBLY PersianSQLFunctions FROM 'F:\LambdaCO\2_PersianDateTimeCLR\PersianSQLFunctions\bin\Debug\PersianSQLFunctions.dll' WITH PERMISSION_SET = SAFE;
- سپس تابع را در SQL Server تعریف کنید:
CREATE FUNCTION ToPersianDate (@dt DateTime)
RETURNS NVARCHAR(10)
AS EXTERNAL NAME PersianSQLFunctions.UserDefinedFunctions.JalaliFunction;
تست تابع ایجاد شده:
SELECT dbo.ToPersianDate(GETDATE()) AS PersianDate;
-- خروجی نمونه: ۱۳۶۱/۰۲/۱۲
نکات مهم
- استفاده از CLR برای تبدیل تاریخ شمسی بسیار دقیق است اما برای حجم زیاد دادهها ممکن است بهینه نباشد.
- در صورت نیاز به پردازشهای سنگین و گزارشگیری، استفاده از جدول DimDate پیشنهاد میشود.
- روش FORMAT سادهترین و سریعترین راه برای نمایش تاریخ شمسی در نسخههای جدید SQL Server است.
سوالات متداول (FAQ)
۱. آیا SQL Server به صورت پیشفرض توابع تاریخ شمسی دارد؟
خیر، باید با روشهای مانند FORMAT، استفاده از جدول DimDate یا ایجاد توابع CLR این تبدیل را انجام دهید.
۲. تفاوت روشهای تبدیل تاریخ چیست؟
FORMAT سریع و ساده است ولی فقط در نسخههای جدید پشتیبانی میشود، جدول DimDate انعطافپذیر و سریع برای گزارشهای بزرگ است و CLR دقت بالا دارد ولی برای دادههای زیاد بهتر است با احتیاط استفاده شود.
۳. چگونه میتوانم تابع CLR را فعال کنم؟
با تنظیمات sp_configure
که در مقاله آمده، میتوانید این قابلیت را فعال کنید.
پیشنهاد مرجع:
اگر به دنبال پیادهسازی گزارشهای دقیق با تاریخ شمسی در SQL Server و Power BI هستید، شرکت توسعه فناوری اطلاعات لاندا با تیم متخصص خود آماده ارائه خدمات مشاوره، آموزش و پیادهسازی پروژههای هوش تجاری است.
ارتباط و مشاوره
برای اطلاعات بیشتر و مشاوره میتوانید از طریق زیر با ما در ارتباط باشید:
نظری داده نشده