متد تبدیل تاریخ میلادی به شمسی در sql server
با استفاده از متد زیر در نسخه های پایینتر SQL Server می توانید تاریخ میلادی را در SQL Server به تاریخ شمسی تبدیل نمایید و در نسخه های جدیدتر میتوانید از دستور Format برای تبدیل انواع تاریخ به یکدیگر استفاده فرمائید.
- CREATE FUNCTION [dbo].[Shamsi]
- (
- @Date1 DATETIME
- )
- RETURNS VARCHAR(10)
- AS
- BEGIN DECLARE @ResultVar VARCHAR(10)
- DECLARE @YEAR INT
- DECLARE @MONTH INT
- DECLARE @DAY INT
- DECLARE @PersianYear INT
- DECLARE @PersianMonth INT
- DECLARE @PersianDay INT
- DECLARE @StartMonthGregorianDateInPersianCalendar INT=10
- DECLARE @StartDayGregorianDateInPersianCalendar INT=11
- DECLARE @DATE NVARCHAR(10)
- SET @DATE = CONVERT(NVARCHAR(10), CONVERT(DATE , @Date1))
- SET @YEAR=CONVERT(INT,SUBSTRING(@DATE,1,4))
- SET @MONTH=CONVERT(INT,SUBSTRING(@DATE,6,2))
- SET @DAY=CONVERT(INT,SUBSTRING(@DATE,9,2))
- DECLARE @GregorianDayIndex INT=0
- IF(dbo.IsLeapYear(@YEAR)=1)
- SET @StartDayGregorianDateInPersianCalendar=11
- ELSE
- IF(dbo.IsLeapYear(@Year-1)=1)
- SET @StartDayGregorianDateInPersianCalendar=12
- ELSE
- SET @StartDayGregorianDateInPersianCalendar=11
- DECLARE @m_index INT=1
- while @m_index<=@Month-1
- BEGIN
- SET @GregorianDayIndex=@GregorianDayIndex + dbo.NumberOfDaysInMonthGregorian(@YEAR,@m_index)
- SET @m_index=@m_index+1
- END
- SET @GregorianDayIndex=@GregorianDayIndex+@DAY
- IF(@GregorianDayIndex>=80)
- BEGIN
- SET @PersianYear=@Year-621
- END
- ELSE
- BEGIN
- SET @PersianYear=@Year-622
- END
- DECLARE @mdays INT
- DECLARE @m INT
- DECLARE @INDEX INT=@GregorianDayIndex
- SET @m_index=0
- while 1=1
- BEGIN
- IF(@m_index<=2)
- SET @m=@StartMonthGregorianDateInPersianCalendar+@m_index
- ELSE
- SET @m=@m_index-2
- SET @mdays = dbo.NumberOfDayInMonthPersian(@YEAR,@m)
- IF(@m=@StartMonthGregorianDateInPersianCalendar)
- SET @mdays=@mdays-@StartDayGregorianDateInPersianCalendar+1
- IF(@index<=@mdays)
- BEGIN
- SET @PersianMonth=@m
- IF(@m=@StartMonthGregorianDateInPersianCalendar)
- SET @PersianDay=@INDEX+@StartDayGregorianDateInPersianCalendar-1
- ELSE
- SET @PersianDay=@INDEX
- break
- END
- ELSE
- BEGIN
- SET @INDEX=@index-@mdays
- SET @m_index=@m_index+1
- END
- END
- SET @ResultVar=CONVERT(VARCHAR(4),@PersianYear)+'/'+RIGHT('0'+CONVERT(VARCHAR(2),@PersianMonth),2)+'/'+RIGHT('0'+CONVERT(VARCHAR(2),@PersianDay),2)
- RETURN @ResultVar
- END
- GO
- CREATE FUNCTION [dbo].[IsLeapYear]
- (
- @YEAR INT
- )
- RETURNS bit
- AS
- BEGIN
- DECLARE @ResultVar bit
- IF @YEAR % 400 = 0
- BEGIN
- SET @ResultVar=1
- END
- ELSE IF @YEAR % 100 = 0
- BEGIN
- SET @ResultVar=0
- END
- ELSE IF @YEAR % 4 = 0
- BEGIN
- SET @ResultVar=1
- END
- ELSE
- BEGIN
- SET @ResultVar=0
- END
- RETURN @ResultVar
- END
- GO
- CREATE FUNCTION [dbo].[NumberOfDaysInMonthGregorian]
- (
- @YEAR INT
- ,@MONTH INT
- )
- RETURNS INT
- AS
- BEGIN
- DECLARE @ResultVar INT
- IF(@Month<>2)
- BEGIN
- SET @ResultVar=30+((@MONTH + FLOOR(@MONTH/8)) % 2)
- END
- ELSE
- BEGIN
- IF(dbo.IsLeapYear(@YEAR)=1)
- BEGIN
- SET @ResultVar=29
- END
- ELSE
- BEGIN
- SET @ResultVar=28
- END
- END
- RETURN @ResultVar
- END
- GO
- CREATE FUNCTION [dbo].[NumberOfDayInMonthPersian]
- (
- @YEAR INT,@MONTH INT
- )
- RETURNS INT
- AS
- BEGIN
- DECLARE @ResultVar INT
- IF(@Month<=6)
- SET @ResultVar=31
- ELSE
- IF(@MONTH=12)
- IF(dbo.IsLeapYear(@Year-1)=1)
- SET @ResultVar=30
- ELSE
- SET @ResultVar=29
- ELSE
- SET @ResultVar=30
- RETURN @ResultVar
- END
نحوه استفاده
SELECT dbo.Shamsi(GETDATE())
و یا
SELECT [dbo].[Shamsi]('2018/02/01')