Конвертировать дату SQL в дату JDE

У меня есть дата ввода в формате 2017-07-27T10:00:00Z который должен быть преобразован в JDE(117208), может кто-нибудь помочь мне, как это сделать в SQL или XSLT. Я действительно ценю твою помощь.

Мне нужен SQL-запрос для того же

input format: 2017-07-27T10: 00: 00Zoutput format: 117208

4 ответа

Просто вы можете сделать это в одну строку:

select dat, concat(datediff(year,'1900-1-1',dat) /100,datediff(year,'1900-1-1',dat) % 100, datepart(DAYOFYEAR,dat) ) as JDE from d

Я сохранил входные данные вашего примера в табличном вызове d под столбцом dat:

dat        JDE
---------- ------------------------------------
2017-07-27 117208

Объяснение:

Для начала важно понять, что такое JDE julian date. именно в этом формате CYYDDD:

  • C стоит на протяжении веков и начинается в 20-м веке (отсюда и жестко закодированная дата 1900-01-01 в моем запросе). C равно 0, если 19xx года. C равен 1 для 2000 года. Вот почему мы взяли вашу дату и получили количество разных лет, начиная с 1900-01-01, и разделили ее на 100, чтобы получить число столетий. datediff(year,'1900-1-1',dat) /100
  • YY обозначает годы в столетии. поэтому, если год 2089, первые три цифры JDE будут 189DDD datediff(year,'1900-1-1',dat) % 100 поможет вам получить остаток века, который годы.
  • DDD - это день года. В SQL Server есть очень хороший день года, используя datepart(DAYOFYEAR,dat)

Теперь мы получаем все три части JDE, которые мы concat() их вместе, и у вас есть год JDE.

РЕДАКТИРОВАТЬ:

Я добавил логику, чтобы все поля имели правильные отступы 0.

SELECT dat ,CONCAT(RIGHT(CONVERT(varchar(1),datediff(year,'1900-1-1',dat) / 100),1) , RIGHT(CONVERT(varchar(2), datediff(year,'1900-1-1',dat) % 100),2), RIGHT('000' + CONVERT(varchar(3),datepart(DAYOFYEAR,dat)),3)) from d

Вот запрос, который вам нужен.

SELECT TO_CHAR(CAST(TO_TIMESTAMP_TZ(REPLACE('2017-07-27T10:00:00Z', 'T', ''), 'YYYY-MM-DD HH:MI:SS TZH:TZM') AS DATE), 'J') as JULIAN
FROM    dual

Кажется, что формат даты, используемый JDE, а именно CYYDDD, часто упоминается в сообществе пользователей JDE как юлианская дата, но на самом деле он не имеет ничего общего с юлианскими числами дня, поскольку этот термин обычно понимают в остальном мире., (И, кроме того, просто для ясности, юлианские числа дня не имеют ничего общего с юлианским календарем.)

При правильном использовании юлианский номер дня относится к 24-часовому периоду, начинающемуся в полдень, хотя я уверен, что это не относится к датам JDE.

Таким образом, вы запутали всех, говоря о датах Юлиана, а не датах JDE.

В XSLT 2.0 вы можете получить последние пять символов даты JDE, используя

format-date($date, '[Y01][d001]')

Но для первого персонажа вам понадобится пользовательская логика:

if ($date lt xs:date('2000-01-01')) then '0' else '1'

или, если вы предпочитаете,

year-from-date($date) idiv 100 - 19

который имеет преимущество работы за 2100.

Ты можешь попробовать.

      select DATEPART(yyyy,GETDATE())*1000+DATEPART(DAYOFYEAR,GETDATE())-1900000

Формат даты должен быть (ГГГГ-ММ-ДД).

Другие вопросы по тегам