PDA

View Full Version : مشکل با function تبدیل تاریخ به شمسی



aurora_sepideh
چهارشنبه 17 مهر 1392, 15:17 عصر
سلام
من یه تابع برای تبدیل تاریخ به شمسی پیدا کردم و ازش استفاده کردم و درست کار می کنه رو چند تا سیستم هم تست کردم درست کار میکنه اما فقط تویه یه سیستم تبدیل نمیکنه و همونجوری میلادی نشون میده خیلی عجیبه ولی اتفاق افتاده.
کسی میدونه ممکنه مشکل از کجا باشه؟

aurora_sepideh
پنج شنبه 18 مهر 1392, 09:32 صبح
یعنی میشه یه بار یه چیز بپرسیم جواب بگیریم!!!!!!!!!!!

fakhravari
پنج شنبه 18 مهر 1392, 16:47 عصر
:بامزه: جاي اينكه خشمگين بشي سمپل خودتو بزار كه برسي بشه

aurora_sepideh
شنبه 20 مهر 1392, 08:45 صبح
از اینا استفاده کردم.


ALTER Function [dbo].[UDF_Gregorian_To_Persian] (@date datetime)
Returns nvarchar(50)
as
Begin
Declare @depoch as bigint
Declare @cycle as bigint
Declare @cyear as bigint
Declare @ycycle as bigint
Declare @aux1 as bigint
Declare @aux2 as bigint
Declare @yday as bigint
Declare @Jofst as Numeric(18,2)
Declare @jdn bigint

Declare @iYear As Integer
Declare @iMonth As Integer
Declare @iDay As Integer

Set @Jofst=2415020.5
Set @jdn=Round(Cast(@date as int)+ @Jofst,0)

Set @depoch = @jdn - [dbo].[UDF_Persian_To_Julian](475, 1, 1)
Set @cycle = Cast(@depoch / 1029983 as int)
Set @cyear = @depoch%1029983

If @cyear = 1029982
Begin
Set @ycycle = 2820
End
Else
Begin
Set @aux1 = Cast(@cyear / 366 as int)
Set @aux2 = @cyear%366
Set @ycycle = Cast(((2134 * @aux1) + (2816 * @aux2) + 2815) / 1028522 as int) + @aux1 + 1
End

Set @iYear = @ycycle + (2820 * @cycle) + 474

If @iYear <= 0
Begin
Set @iYear = @iYear - 1
End
Set @yday = (@jdn - [dbo].[UDF_Persian_To_Julian](@iYear, 1, 1)) + 1
If @yday <= 186
Begin
Set @iMonth = CEILING(Convert(Numeric(18,4),@yday) / 31)
End
Else
Begin
Set @iMonth = CEILING((Convert(Numeric(18,4),@yday) - 6) / 30)
End
Set @iDay = (@jdn - [dbo].[UDF_Persian_To_Julian](@iYear, @iMonth, 1)) + 1

Return Convert(nvarchar(50),@iDay) + '-' + Convert(nvarchar(50),@iMonth) +'-' + Convert(nvarchar(50),@iYear)
End




ALTER FUNCTION [dbo].[UDF_Persian_To_Julian](@iYear int,@iMonth int,@iDay int)
RETURNS bigint
AS
Begin

Declare @PERSIAN_EPOCH as int
Declare @epbase as bigint
Declare @epyear as bigint
Declare @mdays as bigint
Declare @Jofst as Numeric(18,2)
Declare @jdn bigint

Set @PERSIAN_EPOCH=1948321
Set @Jofst=2415020.5

If @iYear>=0
Begin
Set @epbase=@iyear-474
End
Else
Begin
Set @epbase = @iYear - 473
End
set @epyear=474 + (@epbase%2820)
If @iMonth<=7
Begin
Set @mdays=(Convert(bigint,(@iMonth) - 1) * 31)
End
Else
Begin
Set @mdays=(Convert(bigint,(@iMonth) - 1) * 30+6)
End
Set @jdn =Convert(int,@iday) + @mdays+ Cast(((@epyear * 682) - 110) / 2816 as int) + (@epyear - 1) * 365 + Cast(@epbase / 2820 as int) * 1029983 + (@PERSIAN_EPOCH - 1)
RETURN @jdn
End

aurora_sepideh
یک شنبه 21 مهر 1392, 12:57 عصر
مرسی از بررسی تون

fakhravari
دوشنبه 22 مهر 1392, 15:56 عصر
http://learnbi.ir/1391/09/19/post-32/
http://www.barnamenevis.org/showthread.php?52880-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%D8%B1%D9%88-%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D8%A8%D9%87-%D8%B4%D9%85%D8%B3%DB%8C-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%DA%A9%D9%86%D9%85-%D8%A8%D9%88%D8%B3%DB%8C%D9%84%D9%87-sql-%D8%9F
http://www.google.com/#q=%D9%81%D8%A7%D9%86%DA%A9%D8%B4%D9%86+%D8%AA%D8% A7%D8%B1%DB%8C%D8%AE+%D8%A8%D9%87+%D8%B4%D9%85%D8% B3%DB%8C++%D8%AF%D8%B1+sql+server