【问题标题】:How to convert these julian dates to oracle date format?如何将这些朱利安日期转换为 oracle 日期格式?
【发布时间】:2014-08-31 05:29:57
【问题描述】:

下面是一组应该是日期的样本数据。我不确定它应该是哪种格式,但有人告诉我它们是朱利安日期。

     DATE
    92017
    92320
    99002
    99003
    112010
    112011
    112012
    112013

任何人都可以将它们转换为 oracle 日期吗?我试过了

select to_date(DATE,'J') from dual

但有些结果是在 1950 年代和 1940 年代,这与我们正在处理的数据不相符。 我在这里做吗?

我也通过这个链接尝试了这个公式:http://www.kirix.com/stratablog/jd-edwards-date-conversions-cyyddd

SELECT 
TO_DATE(1900+(DATE/1000),1,1)+
TO_NUMBER(SUBSTR(TO_CHAR(DATE),4))-1  FROM DUAL;

谢谢

【问题讨论】:

  • 根据刚才查到的Julian的定义,这是从公元前4713年1月1日开始的天数。 92017/365 的快速计算给了我们大约 252 年,这甚至还没有进入 AD 的范围。在朱利安公式中使用这些数字,这就是你得到的。也许您需要先向它们添加另一个数字。
  • 根据我的经验,人们有时会从 excel 中复制这些东西。 excel 中的这些数字转换为: 12/6/2151 10/4/2152 1/20/2171 1/21/2171 9/2/2206 9/3/2206 9/4/2206 9/5/2206 - 执行这些您正在处理的数据看起来是否正确?
  • @Bob 感谢您的意见。不,这些日期最多应该在 10 到 20 年之间。
  • 我猜它们必须是特定开始日期之后的天数。我认为你应该回到那个告诉你他们是 Julian 的人,并让他再试一次。
  • @JohnD。我在原始问题中添加了您的评论。您能否在原始问题中扩展“不起作用”? julian 的官方定义和 Oracle 定义是“自 4713 年 1 月 1 日起”。我认为该链接中的定义是“自 1900 年 1 月 1 日以来”。同样,如果我们使用 92017,我们会得到 2152 年,它再次出现错误。您需要找出 Julian 开始日期的来源定义,并且需要确认您拥有的数字。这不是技术问题,而是沟通问题。

标签: oracle julian-date


【解决方案1】:

-- 如果 DATE 是数字,则使用 JD Edwards 日期转换

select to_date(to_char(1900 + floor(DATE / 1000)),'YYYY') + mod(DATE,1000) - 1 from dual;

-- 如果 DATE 是字符串,则使用 JD Edwards 日期转换

select to_date(to_char(1900 + floor(to_number(DATE) / 1000)),'YYYY') + mod(to_number(DATE),1000) - 1 from dual;

【讨论】:

  • 每条语句中有两个 DATE 条目,您需要将两者都替换为您正在使用的数字(或字符串)。这些都可以在 Oracle 10g 和 Oracle 11g 上正常工作 - 我目前无法在其他任何东西上测试它们。
  • @bob 虽然数据转换后的结果看起来不太对,但和脚本无关。脚本运行。这些数据可能已损坏或者我遗漏了一些东西。谢谢
【解决方案2】:

我发现从 Julian 转换的最简单方法是:-

SELECT TO_CHAR(TO_DATE(your_julian_date,'JSP'),'dd-Mon-yyyy AD') AS DAY FROM dual;

此外,日期字段是数字还是字符串也没有关系。如果是字符串,只需将 Julian 日期放在单引号内。

此外,儒略的 Oracle 定义是“自公元前 4712 年 1 月 1 日以来的天数”。 (许多人错误地评论为公元前 4713 年)。 参考:https://asktom.oracle.com/pls/apex/asktom.search?tag=julian-date

【讨论】:

    【解决方案3】:

    如果您的日期字段是 varchar:

    select TO_DATE(TO_CHAR(to_number('115032')+1900000),'YYYYDDD') jdedate from dual;
    

    如果您的日期字段是数字:

    select TO_DATE(TO_CHAR(115032+1900000),'YYYYDDD') jdedate from dual;
    

    两者都返回:

    JDEDATE
    -----------
    01/02/2015
    

    【讨论】:

      【解决方案4】:

      简单

      select to_date('0101'|| substr(TRN_REF_NO, 8,2), 'DDMMYY') + to_number(substr(TRN_REF_NO, 10,3)) - 1 Trn_dt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 1970-01-01
        相关资源
        最近更新 更多