امیر آزاد

نه شرقی نه غربی, نه تازی شدن را برای تو ای بوم بر دوست دارم

امیر آزاد

نه شرقی نه غربی, نه تازی شدن را برای تو ای بوم بر دوست دارم

تابع تبدیل تاریخ میلادی به شمسی

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
نظرات 1 + ارسال نظر
faryar یکشنبه 14 بهمن‌ماه سال 1386 ساعت 09:00 ب.ظ

به به چه وبلاگ قشنگی داری .
بای

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد