Конвертировать дату 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
Формат даты должен быть (ГГГГ-ММ-ДД).