Как конвертировать datetime в персидский в SQL Server - PullRequest
10 голосов
/ 15 июля 2011

Я хочу преобразовать дату и время в персидское время на сервере sql.У меня дата-время в формате ММ / ДД / ГГГГ.Есть ли какая-либо функция в SQL Server, чтобы сделать это, как когда я хочу хиджры datetime, я использую это

 select CONVERT(VARCHAR(40), getdate(), 131) //Output is 14/08/1432 5:02:01:197PM 

Я использую SQL Server 2008

Ответы [ 6 ]

10 голосов
/ 29 июля 2015

Я знаю, что уже слишком поздно для ответа на этот вопрос, но я представил функцию, которую я использую в течение долгого времени без каких-либо ошибок, все другие методы, которые я когда-либо видел, имеют проблемы с интеркалярными годами:

CREATE FUNCTION [CalculatePersianDate] ( @intDate DATETIME )
RETURNS NVARCHAR(max)
BEGIN

DECLARE @shYear AS INT ,@shMonth AS INT ,@shDay AS INT ,@intYY AS INT ,@intMM AS INT ,@intDD AS INT ,@Kabiseh1 AS INT ,@Kabiseh2 AS INT ,@d1 AS INT ,@m1 AS INT, @shMaah AS NVARCHAR(max),@shRooz AS NVARCHAR(max),@DayCnt AS INT
DECLARE @DayDate AS NVARCHAR(max)

SET @intYY = DATEPART(yyyy, @intDate)

IF @intYY < 1000 SET @intYY = @intYY + 2000

SET @intMM = MONTH(@intDate)
SET @intDD = DAY(@intDate)
SET @shYear = @intYY - 622
SET @DayCnt = 5

IF ( ( @intYY - 1992 ) % 4 = 0) SET @Kabiseh1 = 0 ELSE SET @Kabiseh1 = 1

IF ( ( @shYear - 1371 ) % 4 = 0) SET @Kabiseh2 = 0 ELSE SET @Kabiseh2 = 1

SET @m1 = 1
SET @d1 = 1
SET @shMonth = 10
SET @shDay = 11

IF ( ( @intYY - 1993 ) % 4 = 0 ) SET @shDay = 12


WHILE ( @m1 != @intMM ) OR ( @d1 != @intDD )
BEGIN

  SET @d1 = @d1 + 1
  SET @DayCnt = @DayCnt + 1

  IF 
  (@d1 = 32 AND (@m1 = 1 OR @m1 = 3 OR @m1 = 5 OR @m1 = 7 OR @m1 = 8 OR @m1 = 10 OR @m1 = 12))
  OR
  (@d1 = 31 AND (@m1 = 4 OR @m1 = 6 OR @m1 = 9 OR @m1 = 11))
  OR
  (@d1 = 30 AND @m1 = 2 AND @Kabiseh1 = 1)
  OR
  (@d1 = 29 AND @m1 = 2 AND @Kabiseh1 = 0)
  BEGIN
    SET @m1 = @m1 + 1
    SET @d1 = 1
  END

  IF @m1 > 12
  BEGIN
    SET @intYY = @intYY + 1
    SET @m1 = 1
  END

  IF @DayCnt > 7 SET @DayCnt = 1

 SET @shDay = @shDay + 1

  IF
  (@shDay = 32 AND @shMonth < 7)
  OR
  (@shDay = 31 AND @shMonth > 6 AND @shMonth < 12)
  OR
  (@shDay = 31 AND @shMonth = 12 AND @Kabiseh2 = 1)
  OR
  (@shDay = 30 AND @shMonth = 12 AND @Kabiseh2 = 0)
  BEGIN
    SET @shMonth = @shMonth + 1
    SET @shDay = 1
  END

  IF @shMonth > 12
  BEGIN
    SET @shYear = @shYear + 1
    SET @shMonth = 1
  END

END

IF @shMonth=1 SET @shMaah=N'فروردین'
IF @shMonth=2 SET @shMaah=N'اردیبهشت'
IF @shMonth=3 SET @shMaah=N'خرداد'
IF @shMonth=4 SET @shMaah=N'تیر'
IF @shMonth=5 SET @shMaah=N'مرداد'
IF @shMonth=6 SET @shMaah=N'شهریور'
IF @shMonth=7 SET @shMaah=N'مهر'
IF @shMonth=8 SET @shMaah=N'آبان'
IF @shMonth=9 SET @shMaah=N'آذر'
IF @shMonth=10 SET @shMaah=N'دی'
IF @shMonth=11 SET @shMaah=N'بهمن'
IF @shMonth=12 SET @shMaah=N'اسفند'

IF @DayCnt=1 SET @shRooz=N'شنبه'
IF @DayCnt=2 SET @shRooz=N'یکشنبه'
IF @DayCnt=3 SET @shRooz=N'دوشنبه'
IF @DayCnt=4 SET @shRooz=N'سه‌شنبه'
IF @DayCnt=5 SET @shRooz=N'چهارشنبه'
IF @DayCnt=6 SET @shRooz=N'پنجشنبه'
IF @DayCnt=7 SET @shRooz=N'جمعه'

--SET @DayDate = @shRooz + " " + LTRIM(STR(@shDay,2)) + " " + @shMaah + " " + STR(@shYear,4)
--پنجشنبه 17 اردیبهشت 1394

/*
SET @DayDate = LTRIM(STR(@shDay,2)) + " " + @shMaah + " " + STR(@shYear,4)
--17 اردیبهشت 1394

SET @DayDate = STR(@shYear,4) + "/"+LTRIM(STR(@shMonth,2)) + "/" + LTRIM(STR(@shDay,2))
--1394/2/17


--1394/02/17
*/
SET @DayDate = REPLACE(RIGHT(STR(@shYear, 4), 4), ' ', '0') + '/'+ REPLACE(STR(@shMonth, 2), ' ', '0') + '/' + REPLACE(( STR(@shDay,2) ), ' ', '0')
RETURN @DayDate
END

Действительно легко настроить результат функции. принято с: эта страница

10 голосов
/ 24 августа 2013

Я знаю, что уже слишком поздно, но, возможно, полезно для других, таких как я, иметь эту проблему.

Вы должны написать функцию SQL для этого преобразования, например: Преобразование григорианской в ​​персидскую дату

, а затем используйте его так:

SELECT dbo.[UDF_Gregorian_To_Persian]('2013-08-24')
2 голосов
/ 03 марта 2016

конвертировать Джалали в грузинский и грузинский в Джалали

попробуйте эту ссылку.Есть некоторая функция, которую вы можете добавить в свой SQL-сервер и просто вызывать их, когда вам нужно.

2 голосов
/ 15 июля 2011

Из коробки нет.

Вы должны написать свой UDF, однако есть один на CodePlex и другой

0 голосов
/ 20 марта 2019

вы можете преобразовать его в шамси с помощью этой функции.

первая функция.СОЗДАТЬ ФУНКЦИЮ [dbo]. [ToPersianDate] (@ dt [datetime]) ВОЗВРАЩАЕТ nvarchar С ВЫПОЛНИТЬ КАК ВЫЗОВ КАК ВНЕШНИЕ ИМЯ [PersianSQLFunctions]. [UserDefinedFunctions]. [ToPersianDate]

GO

1006 *функция.SET ANSI_NULLS OFF GO

SET QUOTED_IDENTIFIER OFF GO

СОЗДАТЬ ФУНКЦИЮ [dbo]. [ToPersianDate] (@ dt [дата / время]) ВОЗВРАЩАЕТ nvarchar С ВЫПОЛНЕНИЕМ КАК ПОЛЬЗОВАТЕЛЕМ [ВНЕШНЕЕ НАЗВАНИЕ] ИМЯ.UserDefinedFunctions]. [ToPersianDate]

GO

третья функция.CREATE FUNCTION [dbo]. [FnToShamsiDate] (@d DateTime) RETURNS NVARCHAR (10) AS BEGIN - объявлять возвращаемую переменную здесь DECLARE @RV NVARCHAR (10) IF (@d) IS NULL RETURN NULL;ELSE SELECT @RV = DBO.ToPersianDate (@D);- Вернуть результат функции RETURN @ RV

END

GO

, а также вы можете найти месяцы шамси из этой функции

create function [dbo]. [fnGetShamsiMonth] (@GregorianDate date) возвращает nvarchar (2) в качестве начала объявлять @ShamsiMonth nvarchar (2), @ShamsiDate nvarchar (10);

set @ShamsiDate = confsys.dbo.fnToShamsiDate(@GregorianDate);

set @ShamsiMonth = SUBSTRING(@ShamsiDate,6,2);

return @ShamsiMonth

end GO

примеры

select confsys.dbo.fnToShamsiDate (getdate ()) результат равен 1397/12/29

получить шамси-месяцы select confsys.dbo.fnGetShamsiMonth (GETDATE ());

0 голосов
/ 01 июля 2018

Я считаю, что наилучшим из доступных решений является использование SQLCLR-Jalali-Date-Utility .Имеет простое руководство по установке и простые в использовании функции.Кроме того, вы можете определить формат преобразованной даты без каких-либо ограничений.фактически вы можете использовать стандартное форматирование времени для определения формы преобразованных дат.

На странице GitHub приведено несколько примеров.

select dbo.GregorianToJalali(GETDATE(),'yyyy/MM/dd hh:mm:ss tt') -- returns 1395/07/01 03:04:33 ب ظ
...