aliila
شنبه 23 آذر 1392, 09:22 صبح
تابع از این کم حجم تر نمیشد . 4 ساعت طول کشید تا نوشتمش و تستش کردم برمبنای تقویم گریگوری نوشته شده . و از تاریخ 10 اکتبر 1582 به بعد را درست نمایش میده .
create FUNCTION [dbo].[miladi_to_shamsi]
( @year as int ,
@mounth as int ,
@day as int
)
RETURNS char(10)
BEGIN
declare @kabise_milady as int,@kabise_milady_1 as int
select @kabise_milady_1= case
when case when (case when (@year-1)%100 =0 then 0 else 1 end)=0 then (@year-1)%400 else ( @year-1)%4 end =0 then 1
else 0
end
if @kabise_milady_1=1
select @kabise_milady=0
else
select @kabise_milady= case
when case when (case when @year %100 =0 then 0 else 1 end)=0 then @year %400 else @year %4 end =0 then 1
else 0
end
select @year = @year-622
select @day =
case @mounth
when 1 then 0 --31
when 2 then 31 --28 or 29
when 3 then 59 +@kabise_milady--31
when 4 then 90+@kabise_milady --30
when 5 then 120+@kabise_milady --31
when 6 then 151+@kabise_milady --30
when 7 then 181+@kabise_milady --31
when 8 then 212+@kabise_milady --31
when 9 then 243+@kabise_milady --30
when 10 then 273+@kabise_milady --31
when 11 then 304+@kabise_milady --30
when 12 then 334 +@kabise_milady--31
end +@day
if @day>79+@kabise_milady
begin
select @year =@year+1
select @day =@day-79
end
else
select @day =@day+286+@kabise_milady_1
if @day=365 select @day=365+ @kabise_milady
select @mounth=case when @day> 186 then (@day-187) /30 +7 else (@day-1) /31 +1 end
select @day=case when @day> 186 then (@day-187) %30+1 else (@day-1) %31 +1 end
return cast(@year as char(4)) + case when @mounth<10 then '/0'+ cast( @mounth as nvarchar(1)) else '/'+ cast( @mounth as nvarchar(2)) end + case when @day<10 then '/0'+ cast( @day as nvarchar(1)) else '/'+ cast( @day as nvarchar(2)) end
END
create FUNCTION [dbo].[miladi_to_shamsi]
( @year as int ,
@mounth as int ,
@day as int
)
RETURNS char(10)
BEGIN
declare @kabise_milady as int,@kabise_milady_1 as int
select @kabise_milady_1= case
when case when (case when (@year-1)%100 =0 then 0 else 1 end)=0 then (@year-1)%400 else ( @year-1)%4 end =0 then 1
else 0
end
if @kabise_milady_1=1
select @kabise_milady=0
else
select @kabise_milady= case
when case when (case when @year %100 =0 then 0 else 1 end)=0 then @year %400 else @year %4 end =0 then 1
else 0
end
select @year = @year-622
select @day =
case @mounth
when 1 then 0 --31
when 2 then 31 --28 or 29
when 3 then 59 +@kabise_milady--31
when 4 then 90+@kabise_milady --30
when 5 then 120+@kabise_milady --31
when 6 then 151+@kabise_milady --30
when 7 then 181+@kabise_milady --31
when 8 then 212+@kabise_milady --31
when 9 then 243+@kabise_milady --30
when 10 then 273+@kabise_milady --31
when 11 then 304+@kabise_milady --30
when 12 then 334 +@kabise_milady--31
end +@day
if @day>79+@kabise_milady
begin
select @year =@year+1
select @day =@day-79
end
else
select @day =@day+286+@kabise_milady_1
if @day=365 select @day=365+ @kabise_milady
select @mounth=case when @day> 186 then (@day-187) /30 +7 else (@day-1) /31 +1 end
select @day=case when @day> 186 then (@day-187) %30+1 else (@day-1) %31 +1 end
return cast(@year as char(4)) + case when @mounth<10 then '/0'+ cast( @mounth as nvarchar(1)) else '/'+ cast( @mounth as nvarchar(2)) end + case when @day<10 then '/0'+ cast( @day as nvarchar(1)) else '/'+ cast( @day as nvarchar(2)) end
END