برای تبدیل تاریخ میلادی به شمسی در SQL Server از کد زیر استفاده کنید
Create FUNCTION [dbo].[Fn_Date2_PersainDate]
(
@Date DATETIME
)
RETURNS NVARCHAR(10)
AS
BEGIN
DECLARE @EDate DATETIME
DECLARE @EYear INT, @EMon SMALLINT, @EDay SMALLINT, @ELeap BIT, @EMonArray CHAR(12), @EDayOfYear INT
DECLARE @FYear INT, @FMon SMALLINT, @FDay SMALLINT, @FLeap BIT, @FMonArray CHAR(12)
SELECT @FMonArray= CHAR(31)+CHAR(31)+Char(31)+CHAR(31)+CHAR(31)+CHAR(31)+CHAR(30)+CHAR(30)+CHAR(30)+CHAR(30)+CHAR(30)+CHAR(29)
SELECT @EMonArray= CHAR(31)+CHAR(28)+Char(31)+CHAR(30)+CHAR(31)+CHAR(30)+CHAR(31)+CHAR(31)+CHAR(30)+CHAR(31)+CHAR(30)+CHAR(31)
SET @EDate = @Date
SELECT @EYear= Year(@EDate)
SELECT @EMon= Month(@EDate)
SELECT @EDay= Day(@EDate)
IF((@EYear%4)=0)
SELECT @ELeap=1
ELSE
SELECT @ELeap=0
--------------------- Calc Day Of Year
DECLARE @Temp INT, @Cnt INT
SELECT @Cnt=@EMon-1
SELECT @Temp=0
WHILE(@Cnt<>0)
BEGIN
IF((@Cnt=2) AND (@ELeap=1))
SELECT @Temp= @Temp+29
ELSE
SELECT @Temp= @Temp + ASCII(SUBSTRING(@EMonArray, @Cnt, 1))
SELECT @Cnt=@Cnt-1
END
SELECT @EDayOfYear= @Temp+@EDay
---------------------- Convert to Farsi
SELECT @Temp= @EDayOfYear-79
IF(@Temp>0)
SELECT @FYear= @EYear-621
ELSE
BEGIN
SELECT @FYear= @EYear-622
IF((@FYear %4)=3)
SELECT @Temp=@Temp+366
ELSE
SELECT @Temp= @Temp+365
END
IF((@FYear %4)=3)
SELECT @FLeap=1
ELSE
SELECT @Fleap=0
SELECT @Cnt= 1
WHILE((@Temp<>0) AND (@Temp>ASCII(SUBSTRING(@FMonArray, @Cnt, 1))))
BEGIN
IF(@Cnt=12)
BEGIN
IF (@FLeap=1)
SELECT @Temp=@Temp-30
ELSE
SELECT @Temp= @Temp-29
END
ELSE
SELECT @Temp= @Temp-ASCII(SUBSTRING(@FMonArray, @Cnt, 1))
SELECT @Cnt= @Cnt+1
END
IF(@Temp<>0)
BEGIN
SELECT @FMon= @Cnt
SELECT @FDay= @Temp
END
ELSE
BEGIN
SELECT @FMon= 12
SELECT @FDay=30
END
------------------ Create Output
DECLARE @YStr CHAR(4), @MStr CHAR(2), @DStr CHAR(2)
SELECT @YStr= CONVERT(CHAR, @FYear)
IF(@FMon<10)
SELECT @MStr='0'+CONVERT(CHAR, @FMon)
ELSE
SELECT @MStr=CONVERT(CHAR, @FMon)
IF(@FDay<10)
SELECT @DStr='0'+CONVERT(CHAR, @FDay)
ELSE
SELECT @DStr=CONVERT(CHAR, @FDay)
------------------ End Of Function
RETURN (@YStr+'/'+@MStr+'/'+@dStr)
END
برای تبدیل تاریخ شمسی به میلادی در SQL Server از کد زیر استفاده می کنید
Create FUNCTION [dbo].[Fn_PersianDate2English]
(
@FD NVARCHAR(10)
)
RETURNS SMALLDATETIME AS
BEGIN
Declare @syy bigint
Declare @smm bigint
Declare @sdd bigint
Declare @val bigint
Declare @By bigint
declare @mstart datetime
declare @Mc int
declare @sbase int
declare @sleapbmp nchar(150)
declare @ind as int
-- set @fd='1384/02/11'
set @mstart = '1900/03/21'
set @syy = substring(@FD,1,4)
set @smm = substring(@FD,6,2)
set @sdd = substring(@FD,9,2)
set @By = '1279'
set @sleapbmp='00001000100010001000100010001000010001000100010001000100010001000010001000100010001000100010001000010001000100010001000100010001'
set @sbase=475
-- print @smm
set @val = 0
While (@By < @syy)
begin
set @ind = (@By - @sbase) % (128 + 1)
if substring(@sleapbmp, @ind, 1) ='1'
Begin
set @val = @val + 1
end
set @val = @val + 365
set @By = @By + 1
end
set @Mc=1
while @mc< @smm
begin
Select @val =Case
When @Mc= 1 Then @Val+31
When @Mc= 2 Then @Val+31
When @Mc= 3 Then @Val+31
When @Mc= 4 Then @Val+31
When @Mc= 5 Then @Val+31
When @Mc= 6 Then @Val+31
When @Mc= 7 Then @Val+30
When @Mc= 8 Then @Val+30
When @Mc= 9 Then @Val+30
When @Mc= 10 Then @Val+30
When @Mc= 11 Then @Val+30
When @Mc= 12 Then @Val+29
end
set @mc=@mc+1
end
set @val = @val + @sdd
SET @mstart = DATEADD(day,@val,@mstart);
RETURN @mstart
END
ارسال دیدگاه :