PDA

View Full Version : سوال: یکی بگه مشکل تابع من کجاست ؟؟(تابع تبدیل تاریخ میلادی به شمسی)



ghrzarei
پنج شنبه 22 اسفند 1387, 19:49 عصر
با عرض سلام
ببخشید من در sqlserver2005 تازه کار هستم و این اولین تابعی می باشه که نوشتم.
تابع معادل آن در vb6 و یا C# جواب می دهد ولی در sqlserver2005 مقدار null را بر می گرداند علت چیست ؟؟
ضمنا توابع دیگری روی سایت پیدا کردم ولی سالهای کبیسه را پشتیبانی نمی کند.



CREATE FUNCTION [dbo].[MiladiToShamsi2](@dt smalldatetime)
RETURNS Nchar(10) AS
begin


Declare @Days int
Declare @Year_Length int
Declare @Sal int
Declare @Mah int
Declare @Day1 int
Declare @Years int
Declare @Tem int
Declare @Tem2 int


set @Days = datediff(day,1953/03/21,@dt)
set @Years = 0
set @Year_Length = 0
--
While @Days >= 0
begin
set @Tem = (1342 + @Years)-1309
If ((((@Tem % 32) - floor(@Tem / 32)) % 4) = 0 ) set @Year_Length = 366
If ((((@Tem % 32) - floor(@Tem / 32)) % 4) <> 0 ) set @Year_Length = 365



If (@Days - @Year_Length >= 0)
begin
set @Years = @Years + 1
set @Days = @Days - @Year_Length
end
Else
begin
set @Sal = 1342 + @Years


If (@Days <= 185)
begin
set @Mah = 1 + floor(@Days / 31)
set @Day1 = 1 + (@Days % 31)
end
Else
begin
set @Days = @Days - 186
set @Mah = 7 + floor(@Days / 30)
set @Day1 = 1 + (@Days % 30)
end


end
break
end
Return str(@Sal) + '/' + str(@Mah) + '/' + str(@Day1)


end

ASKaffash
دوشنبه 26 اسفند 1387, 14:41 عصر
سلام
برنامه اصلا از نقطه Select 1 عبور نمی کند برای همین همه مقادیر null هستند:


declare @dt smalldatetime
Declare @Days int
Declare @Year_Length int
Declare @Sal int
Declare @Mah int
Declare @Day1 int
Declare @Years int
Declare @Tem int
Declare @Tem2 int

set @dt=getdate()

set @Days = datediff(day,1953/03/21,@dt)
set @Years = 0
set @Year_Length = 0
--
While @Days >= 0 begin
set @Tem = (1342 + @Years)-1309
If ((((@Tem % 32) - floor(@Tem / 32)) % 4) = 0 )
set @Year_Length = 366
If ((((@Tem % 32) - floor(@Tem / 32)) % 4) <> 0 )
set @Year_Length = 365
If (@Days - @Year_Length >= 0) begin
Select 0
set @Years = @Years + 1
set @Days = @Days - @Year_Length end
Else begin
Select 1
set @Sal = 1342 + @Years
If (@Days <= 185) begin
set @Mah = 1 + floor(@Days / 31)
set @Day1 = 1 + (@Days % 31) end
Else begin
set @Days = @Days - 186
set @Mah = 7 + floor(@Days / 30)
set @Day1 = 1 + (@Days % 30) end
end
break
end
Select str(@Sal) , str(@Mah) , str(@Day1)

reza-abi
دوشنبه 09 آذر 1388, 18:53 عصر
با عرض سلام
ببخشید من در sqlserver2005 تازه کار هستم و این اولین تابعی می باشه که نوشتم.
تابع معادل آن در vb6 و یا C#‎‎ جواب می دهد ولی در sqlserver2005 مقدار null را بر می گرداند علت چیست ؟؟
ضمنا توابع دیگری روی سایت پیدا کردم ولی سالهای کبیسه را پشتیبانی نمی کند.



CREATE FUNCTION [dbo].[MiladiToShamsi2](@dt smalldatetime)
RETURNS Nchar(10) AS
begin


Declare @Days int
Declare @Year_Length int
Declare @Sal int
Declare @Mah int
Declare @Day1 int
Declare @Years int
Declare @Tem int
Declare @Tem2 int


set @Days = datediff(day,1953/03/21,@dt)
set @Years = 0
set @Year_Length = 0
--
While @Days >= 0
begin
set @Tem = (1342 + @Years)-1309
If ((((@Tem % 32) - floor(@Tem / 32)) % 4) = 0 ) set @Year_Length = 366
If ((((@Tem % 32) - floor(@Tem / 32)) % 4) <> 0 ) set @Year_Length = 365



If (@Days - @Year_Length >= 0)
begin
set @Years = @Years + 1
set @Days = @Days - @Year_Length
end
Else
begin
set @Sal = 1342 + @Years


If (@Days <= 185)
begin
set @Mah = 1 + floor(@Days / 31)
set @Day1 = 1 + (@Days % 31)
end
Else
begin
set @Days = @Days - 186
set @Mah = 7 + floor(@Days / 30)
set @Day1 = 1 + (@Days % 30)
end


end
break
end
Return str(@Sal) + '/' + str(@Mah) + '/' + str(@Day1)


end
[/quote]