PDA

View Full Version : بهترین و سریع ترین و کم حجم ترین تابع میلادی به شمسی - تقویم گریگوری



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

cherchil_hra
شنبه 23 آذر 1392, 11:15 صبح
تابع شما رو برای سال 2013 تا امروز چک کردم و نتیجه
تعداد مغایرت: 83 مورد

فایل مغایرت ها: ستون d1 تاریخ برگردانده شده توسط تابع شما و d2 تاریخ صحیح

113945
موفق باشید!

aliila
شنبه 23 آذر 1392, 14:13 عصر
حالا اصلاحش کردم
باز ببین مشکلی نداره ؟

cherchil_hra
شنبه 23 آذر 1392, 21:31 عصر
ماه ششم میلادیت از هشتم به بعد ایراد داره و ماه 7 تا 12 میلادیت هم همش ایراد داره
سالهای خروجیت یکسال کوچکتر هستند