تبدیل تاریخ شمسی به میلادی در sql server
برخی مواقع در هنگام ایجاد لاگ سیستم تاریخ های میلادی را در دیتابیس نگهداری میکنیم که برای اینکه بخواهیم تاریخ های میلادی را در یک نگاه بصورت شمسی هم مشاهده کنیم لازم است که یک تبدیل تاریخ صورت گیرد.
در این مثال ما با استفاده از یک تابع در Sql Server این کار را انجام می دهیم.
ALTER Function [dbo].[ToTimeSolar] ( @date DATETIME )
RETURNS NVARCHAR(50)
BEGIN
DECLARE @shYear AS INT ,@shMonth AS INT ,@shDay AS INT ,@intYY AS INT ,@intMM AS INT ,@intDD AS INT ,@Kabiseh1 AS INT ,@Kabiseh2 AS INT ,@d1 AS INT ,@m1 AS INT, @shMaah AS NVARCHAR(max),@shRooz AS NVARCHAR(max),@DayCnt AS INT
DECLARE @DayDate AS NVARCHAR(max)
SET @intYY = DATEPART(yyyy, @date)
IF @intYY < 1000 SET @intYY = @intYY + 2000
SET @intMM = MONTH(@date)
SET @intDD = DAY(@date)
SET @shYear = @intYY - 622
SET @DayCnt = datepart(dw, '01/02/' + CONVERT(CHAR(4), @intYY))
SET @m1 = 1
SET @d1 = 1
SET @shMonth = 10
SET @shDay = 11
IF ( ( @intYY - 1993 ) % 4 = 0 ) SET @shDay = 12
WHILE ( @m1 != @intMM ) OR ( @d1 != @intDD )
BEGIN
SET @d1 = @d1 + 1
SET @DayCnt = @DayCnt + 1
IF ( ( @intYY - 1992 ) % 4 = 0) SET @Kabiseh1 = 1 ELSE SET @Kabiseh1 = 0
IF ( ( @shYear - 1371 ) % 4 = 0) SET @Kabiseh2 = 1 ELSE SET @Kabiseh2 = 0
IF
(@d1 = 32 AND (@m1 = 1 OR @m1 = 3 OR @m1 = 5 OR @m1 = 7 OR @m1 = 8 OR @m1 = 10 OR @m1 = 12))
OR
(@d1 = 31 AND (@m1 = 4 OR @m1 = 6 OR @m1 = 9 OR @m1 = 11))
OR
(@d1 = 30 AND @m1 = 2 AND @Kabiseh1 = 1)
OR
(@d1 = 29 AND @m1 = 2 AND @Kabiseh1 = 0)
BEGIN
SET @m1 = @m1 + 1
SET @d1 = 1
END
IF @m1 > 12
BEGIN
SET @intYY = @intYY + 1
SET @m1 = 1
END
IF @DayCnt > 7 SET @DayCnt = 1
SET @shDay = @shDay + 1
IF
(@shDay = 32 AND @shMonth < 7)
OR
(@shDay = 31 AND @shMonth > 6 AND @shMonth < 12)
OR
(@shDay = 31 AND @shMonth = 12 AND @Kabiseh2 = 1)
OR
(@shDay = 30 AND @shMonth = 12 AND @Kabiseh2 = 0)
BEGIN
SET @shMonth = @shMonth + 1
SET @shDay = 1
END
IF @shMonth > 12
BEGIN
SET @shYear = @shYear + 1
SET @shMonth = 1
END
END
SET @DayDate = Convert(nvarchar(50),@shYear)+'/'+RIGHT('0' + CAST(@shMonth AS VARCHAR), 2)+'/'+RIGHT('0' + CAST(@shDay AS VARCHAR), 2)+ ' ' + LEFT(CONVERT(TIME,@date),5)
RETURN @DayDate
END
تابع بالا را با استفاده از کدهای زیر در اسکویل سرور صدا می زنیم
select dbo.ToTimeSolar('2016-06-25 04:05:52.447')
و خروجی این تابع به شکل زیر خواهد بود
1395/04/05 04:05
convert Gregorian to persian date in sql server
convert miladi to persian date in sql server
اون تابع فرمت که اون دوستمون دکتر دیتابیس نام بردن فقط از ورژن اس کیو ال 2016 به بالا کار میکنه و خیلی وقتا لازمه که از اس کیو ال ورژنهای پاینتر استفاده بشه
ولی تبدیل تاریخ به این راحتی نیست مثلا بر خلاف انتظار همه سال 1407 کبیسه نیست در عوض سال 1408 کبیسه است یعنی بعد از سال 1403 فاصله کبیسه بعدی 5 سال است و این هر 135 سال یک بار اتفاق میافتد این موضوع توی تابع نوشته شده در نظر گرفته نشده و اگر قصد استفاده از این تابع را دارید مواظب باشید
چه کاریه اخه یه تابع به این سنگینی و بنویسی که بخوابی میلادی رو تبدیل به شمسی کنی
FORMAT(GETDATE(), 'yyyy/MM/dd', 'fa')
با کد بالا به راحتی میتونی همینی که نوشتی رو داشته باشی و تمام بدون هیچ باگی
عنوان مقاله «تبدیل شمسی به میلادی» است ولی محتوای صفحه «تبدیل میلادی به شمسی» !!!!!
دست شما درد نکنه خیلی کار راه اندازه عااالی