SQL - дата Жюльена (CYYDDD) до даты - PullRequest
0 голосов
/ 12 декабря 2018

К сожалению, это мой первый подход к SQL!Я создаю с помощью следующего кода запрос между оракулом БД и Excel (Power Query).

select "$Table"."Order" as "Order",
    "$Table"."NR" as "Nr",
    "$Table"."JDDATE" as "JDDATE"
from "POOLDB2"."3112" "$Table"
WHERE   "Key" >118001
    AND "CodeAA" = 1

Этот код работает!

Теперь я хочу отформатировать юлианскую дату (CYYDDD) - например, 118001 для 01.01.2019 - в обычный формат даты.Кто-нибудь знает, как реализовать это в коде выше?Может быть что-то вроде:

select "$Table"."Order" as "Order",
    "$Table"."NR" as "Nr",
    DATEADD(DAY, JDDATE % 1000 - 1, DATEADD(year, JDDATE/1000, 0))
    "$Table"."JDDATE" as "JDDATE"
from "POOLDB2"."3112" "$Table"
WHERE   "Key" >118001
    AND "CodeAA" = 1

С уважением

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Для Oracle

select to_char(sysdate,'J') from dual; --To Julian Date
select to_date(2456143,'J') from dual; --To Normal Date

должно работать.

Редактировать: Извините, я не увидел метку оракула. ​​

Редактировать: Для запрашиваемого поведения по OP

select to_date(to_char(1901 + floor(118001 / 1000)),'YYYY') from dual;
0 голосов
/ 12 декабря 2018

Вы можете использовать имеющееся у вас значение 118001, разделив его на отдельные разделы года и дня, добавив к номинальной дате начала 1900-01-01 (основываясь на вашем комментарии, что 118001 на самом деле 2018-01-01, а не 2019-01-01):

select date '1900-01-01'
  + floor(118001 / 1000) * interval '1' year
  + (mod(118001, 1000) - 1) * interval '1' day
from dual;

DATE'1900-
----------
2018-01-01

или, запустив фиксированную дату днем ​​ранее, вы можете удалить явное -1:

select date '1899-12-31'
  + floor(118019 / 1000) * interval '1' year
  + mod(118019, 1000) * interval '1' day
from dual;

DATE'1899-
----------
2018-01-19

. Это позволяет избежать создания более длинной строки дляпреобразовать в дату, хотя вы могли бы сделать это (изменив подход @ GMB) следующим образом:

select to_date(to_char(1900 + floor(118001 / 1000)) || '-01-01', 'YYYY-MM-DD')
  + (mod(118001, 1000) - 1)
from dual;

Необходимо указать, по крайней мере, месяц в вызове to_date(), поскольку Oracle по умолчанию использует текущий месяцесли это не поставляется.Такое поведение скрыто в документации :

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

Первая часть этого достаточно известна и имеет смысл;вторая часть немного менее очевидна и не дает понять, что она применима и к частичным датам - так что, если вы не указали год, используется текущий год;если вы не указали месяц, используется текущий месяц;но если вы не указали день, тогда используется 1-й.

Вы можете увидеть, что он делает, с некоторыми тестовыми конверсиями:

select to_date('2018-12-25', 'YYYY-MM-DD') as demo_a,
  to_date('12:34:56', 'HH24:MI:SS') as demo_b,
  to_date('2019', 'YYYY') as demo_c,
  to_date('07-04', 'MM-DD') as demo_d,
  to_date('2019-01', 'YYYY-MM') as demo_e
from dual;

DEMO_A              DEMO_B              DEMO_C              DEMO_D              DEMO_E             
------------------- ------------------- ------------------- ------------------- -------------------
2018-12-25 00:00:00 2018-12-01 12:34:56 2019-12-01 00:00:00 2018-07-04 00:00:00 2019-01-01 00:00:00
0 голосов
/ 12 декабря 2018

Существует много разных форматов для юлианской даты ... В вашем случае это должно быть сделано:

with t as (select 118001 jd from dual)
select to_char( to_date(to_char(1901 + floor(jd / 1000)),'YYYY') + mod(jd,1000) - 1, 'dd.mm.yyyy' ) from t

Выход: 01.01.2019

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...