با سلام به دوستان،
دو تابع زیر را جهت تبدیل تاریخ میلادی به شمسی و بالعکس نوشته ام. می توانید امتحان کنید:
1 - تبدیل تاریخ میلادی به شمسی:

CREATE FUNCTION DateFarsi(@DateLatin AS DateTime)
RETURNS CHAR(10) AS
BEGIN
DECLARE @DateFarsi CHAR(10)

DECLARE @Days int
DECLARE @Tmp int

DECLARE @Year_Farsi int
DECLARE @Month_Farsi int
DECLARE @Day_Farsi int

SET @Days = DATEDIFF(DAY, '19000320', @DateLatin)

SET @Year_Farsi = 1279
SET @Month_Farsi = 01
SET @Day_Farsi = 01

SET @Tmp = @Days / 365

IF (@Tmp * 365) + ((@Tmp + 3) / 4) > @Days
SET @Tmp = @Tmp - 1
SET @Year_Farsi = @Year_Farsi + @Tmp
SET @Days = @Days - (@Tmp * 365) - ((@Tmp + 3) / 4)

IF @Days <= 186
BEGIN
SET @Tmp = @Days / 31
SET @Month_Farsi = @Month_Farsi + @Tmp
SET @Days = @Days - (@Tmp * 31)
END
ELSE
BEGIN
SET @Days = @Days - 186
SET @Tmp = @Days / 30
SET @Month_Farsi = @Month_Farsi + @Tmp + 6
SET @Days = @Days - (@Tmp * 30)
END
SET @Day_Farsi = @Day_Farsi + @Days

RETURN REPLACE(STR(@Year_Farsi, 4, 0) +
STR(@Month_Farsi, 2, 0) +
STR(@Day_Farsi,2, 0), ' ', '0')
END

2 - تبدیل تاریخ شمسی به میلادی:

CREATE FUNCTION DateLatin(@DateFarsi CHAR(10))
RETURNS DateTime AS
BEGIN
SET @DateFarsi = REPLACE(@DateFarsi, '/', '')

DECLARE @Days BigInt

DECLARE @Year_Farsi int
DECLARE @Month_Farsi int
DECLARE @Day_Farsi int

SET @Year_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 1, 4))
SET @Month_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 5, 2))
SET @Day_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 7, 2))

SET @Days = ((@Year_Farsi - 1279) * 365) + ((@Year_Farsi - 1276) / 4)

IF @Month_Farsi <= 7
SET @Days = @Days + ((@Month_Farsi - 1) * 31)
ELSE
SET @Days = @Days + ((@Month_Farsi - 7) * 30) + 186

RETURN DATEADD(DAY, @Days + @Day_Farsi - 1, '19000320')
END

انشاء الله مقبول بیافتد.