دسته بندی ها

آخرین مطالب

برچسب ها

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

برای تبدیل تاریخ میلادی به شمسی در SQL Server از کد زیر استفاده کنید 

 

Create FUNCTION [dbo].[Fn_Date2_PersainDate]
(
	@Date DATETIME
)
RETURNS NVARCHAR(10)
AS
BEGIN


	DECLARE @EDate DATETIME
	DECLARE @EYear INT, @EMon SMALLINT, @EDay SMALLINT, @ELeap BIT, @EMonArray CHAR(12), @EDayOfYear INT
	DECLARE @FYear INT, @FMon SMALLINT, @FDay SMALLINT, @FLeap BIT, @FMonArray CHAR(12)
	SELECT @FMonArray= CHAR(31)+CHAR(31)+Char(31)+CHAR(31)+CHAR(31)+CHAR(31)+CHAR(30)+CHAR(30)+CHAR(30)+CHAR(30)+CHAR(30)+CHAR(29)
	SELECT @EMonArray= CHAR(31)+CHAR(28)+Char(31)+CHAR(30)+CHAR(31)+CHAR(30)+CHAR(31)+CHAR(31)+CHAR(30)+CHAR(31)+CHAR(30)+CHAR(31)
	SET @EDate = @Date
	SELECT @EYear= Year(@EDate)
	SELECT @EMon= Month(@EDate)
	SELECT @EDay= Day(@EDate)
	
	IF((@EYear%4)=0)
		SELECT @ELeap=1
	ELSE
		SELECT @ELeap=0
	--------------------- Calc Day Of Year
	DECLARE @Temp INT, @Cnt INT 
	SELECT @Cnt=@EMon-1
	SELECT @Temp=0
	WHILE(@Cnt<>0)
	BEGIN
		IF((@Cnt=2) AND (@ELeap=1))
			SELECT @Temp= @Temp+29
		ELSE
			SELECT @Temp= @Temp + ASCII(SUBSTRING(@EMonArray, @Cnt, 1))
		SELECT @Cnt=@Cnt-1
	END
	SELECT @EDayOfYear= @Temp+@EDay
	---------------------- Convert to Farsi
	SELECT @Temp= @EDayOfYear-79
	IF(@Temp>0)
		SELECT @FYear= @EYear-621
	ELSE
	BEGIN
		SELECT @FYear= @EYear-622
		IF((@FYear %4)=3)
			SELECT @Temp=@Temp+366
		ELSE
			SELECT @Temp= @Temp+365
	END
	IF((@FYear %4)=3)
		SELECT @FLeap=1
	ELSE
		SELECT @Fleap=0
	SELECT @Cnt= 1
	WHILE((@Temp<>0) AND (@Temp>ASCII(SUBSTRING(@FMonArray, @Cnt, 1))))
	BEGIN
		IF(@Cnt=12)
		BEGIN
			IF (@FLeap=1)
				SELECT @Temp=@Temp-30
			ELSE
				SELECT @Temp= @Temp-29
		END
		ELSE
			SELECT @Temp= @Temp-ASCII(SUBSTRING(@FMonArray, @Cnt, 1))
		SELECT @Cnt= @Cnt+1
	END
	IF(@Temp<>0)
	BEGIN
		SELECT @FMon= @Cnt
		SELECT @FDay= @Temp
	END
	ELSE
	BEGIN
		SELECT @FMon= 12
		SELECT @FDay=30
	END
	------------------ Create Output
	DECLARE @YStr CHAR(4), @MStr CHAR(2), @DStr CHAR(2)
	SELECT @YStr= CONVERT(CHAR, @FYear)
	IF(@FMon<10)
		SELECT @MStr='0'+CONVERT(CHAR, @FMon)
	ELSE
	SELECT @MStr=CONVERT(CHAR, @FMon)
	IF(@FDay<10)
		SELECT @DStr='0'+CONVERT(CHAR, @FDay)
	ELSE
		SELECT @DStr=CONVERT(CHAR, @FDay)
	------------------ End Of Function
	RETURN (@YStr+'/'+@MStr+'/'+@dStr)

END

 

برای تبدیل تاریخ شمسی به میلادی در SQL Server از کد زیر استفاده می کنید

 

Create FUNCTION [dbo].[Fn_PersianDate2English]
(
	@FD NVARCHAR(10)
)
RETURNS SMALLDATETIME AS
BEGIN
	Declare @syy bigint 
	Declare @smm bigint 
	Declare @sdd bigint 
	Declare @val  bigint 
	Declare @By bigint 
	declare  @mstart datetime 
	declare @Mc  int

	declare @sbase int
	declare @sleapbmp nchar(150)
	declare @ind as int

	
	
--	set @fd='1384/02/11'
	set @mstart = '1900/03/21'

	set @syy = substring(@FD,1,4)
	set @smm = substring(@FD,6,2)
	set @sdd = substring(@FD,9,2)
	set @By = '1279'

	set @sleapbmp='00001000100010001000100010001000010001000100010001000100010001000010001000100010001000100010001000010001000100010001000100010001'
	set @sbase=475

--	print @smm

	   set   @val = 0

	   While (@By < @syy)
                 begin
	
	set @ind = (@By - @sbase) % (128 + 1)
		if   substring(@sleapbmp, @ind, 1)  ='1'
			  Begin	
			         set @val = @val + 1
		                 end		

		      set @val = @val + 365
		      set @By = @By + 1
	  end

	  set @Mc=1
	  while  @mc< @smm
			
		  begin 
		    Select @val =Case 
			When @Mc= 1 Then @Val+31 
			When @Mc= 2 Then @Val+31 
			When @Mc= 3 Then @Val+31 
			When @Mc= 4 Then @Val+31 
			When @Mc= 5 Then @Val+31 
			When @Mc= 6 Then @Val+31 
			When @Mc= 7 Then @Val+30
			When @Mc= 8 Then @Val+30 
			When @Mc= 9 Then @Val+30 
			When @Mc= 10 Then @Val+30 
			When @Mc= 11 Then @Val+30 
			When @Mc= 12 Then @Val+29
		end
	            set @mc=@mc+1	
    end
    
	set @val = @val + @sdd
	
	SET @mstart = DATEADD(day,@val,@mstart);
	
	RETURN @mstart
   
END
ارسال دیدگاه :