Create FUNCTION [dbo].[fns_persian_date](@ddat datetime) RETURNS char(10) as
BEGIN
Declare @chkab int
Declare @da int
Declare @mo int
Declare @ye int
Declare @ld int
Declare @tt1 varchar(100)
Declare @tt2 varchar(100)
Declare @tt3 varchar(100)
Declare @buf1 Table(i int, v int)
Declare @buf2 table(i int, v int)
set @chkab = 0
insert into @buf1 (i,v) values (1,0)
insert into @buf1 (i,v) values (2,31)
insert into @buf1 (i,v) values (3,59)
insert into @buf1 (i,v) values (4,90)
insert into @buf1 (i,v) values (5,120)
insert into @buf1 (i,v) values (6,151)
insert into @buf1 (i,v) values (7,181)
insert into @buf1 (i,v) values (8,212)
insert into @buf1 (i,v) values (9,243)
insert into @buf1 (i,v) values (10,273)
insert into @buf1 (i,v) values (11,304)
insert into @buf1 (i,v) values (12,334)
insert into @buf2 (i,v) values (1,0)
insert into @buf2 (i,v) values (2,31)
insert into @buf2 (i,v) values (3,60)
insert into @buf2 (i,v) values (4,91)
insert into @buf2 (i,v) values (5,121)
insert into @buf2 (i,v) values (6,152)
insert into @buf2 (i,v) values (7,182)
insert into @buf2 (i,v) values (8,213)
insert into @buf2 (i,v) values (9,244)
insert into @buf2 (i,v) values (10,274)
insert into @buf2 (i,v) values (11,305)
insert into @buf2 (i,v) values (12,335)
--اگر سال میلادی کبیسه نباشد
If Year(@ddat) % 4 != 0
BEGIN
Select @da = v + Day(@ddat) From @buf1 Where i = Month(@ddat)
If @da > 79 --اگر از اول فروردین به بعد باشد
Begin
Set @da = @da - 79
If @da <= 186 -- اگر شش ماه اول سال شمسی باشد
Begin
If @da % 31 = 0
Begin
Set @mo = @da / 31
Set @da=31
End
Else
Begin
Set @mo = Floor(@da / 31) + 1
Set @da = @da % 31
End
Set @ye = Year(@ddat) - 621
End
Else --اگر مهر تا دی باشد
Begin
Set @da = @da - 186
If @da % 30 = 0
Begin
Set @mo = (@da / 30) + 6
Set @da = 30
End
Else
Begin
Set @mo = Floor(@da / 30) + 7
Set @da = @da % 30
End
Set @ye = Year(@ddat) - 621
End
End
Else -- اگر از اول سال میلادی تا آخر اسفند باشد
Begin
If Year(@ddat) > 1996 And (Year(@ddat) % 4) = 1 --استثنا سال کبیسه از سال 96 به بعد
Set @ld=11
Else
Set @ld=10
Set @da = @da + @ld
If @da % 30 = 0
Begin
Set @mo = (@da / 30) + 9
Set @da = 30
End
Else
Begin
Set @mo = Floor(@da / 30) + 10
Set @da = @da % 30
End
Set @ye = Year(@ddat) - 622
End
END
Else --اگر سال میلادی کبیسه باشد
BEGIN
Select @da = v + Day(@ddat) From @buf2 Where i = Month(@ddat)
If Year(@ddat) >= 1996 --سال کبیسه از 96 به بعد
Set @ld = 79
Else
Set @ld = 80
If @da > @ld --اگر از اول فروردین به بعد باشد
Begin
Set @da = @da - @ld --اگر شش ماه اول سال باشد
If @da <= 186
Begin
If @da % 31 = 0
Begin
Set @mo = @da / 31
Set @da = 31
End
Else
Begin
Set @mo = Floor(@da / 31) + 1
Set @da = @da % 31
End
Set @ye = Year(@ddat) - 621
End
Else -- اگر از مهر تا دی باشد
Begin
Set @da = @da - 186
If @da % 30 = 0
Begin
Set @mo = (@da / 30) + 6
Set @da = 30
End
Else
Begin
Set @mo = Floor(@da / 30) + 7
Set @da = @da % 30
End
Set @ye = Year(@ddat) - 621
End
End
Else --اگر از اول سال میلادی تا آخر اسفند باشد
Begin
Set @da = @da + 10
If @da % 30 = 0
Begin
Set @mo = (@da / 30) + 9
Set @da = 30
End
Else
Begin
Set @mo = Floor(@da / 30) + 10
Set @da = @da % 30
End
Set @ye = Year(@ddat) - 622
End
END
Set @tt1 = Convert(varchar(100),@ye)
Set @tt2 = Convert(varchar(100),@mo)
Set @tt3 = Convert(varchar(100),@da)
If Len(@tt2) = 1 Set @tt2 = '0' + @tt2
If Len(@tt3) = 1 Set @tt3 = '0' + @tt3
Return @tt1 + '/' + @tt2 + '/' + @tt3
END