在oracle中转换5位日期

在oracle中转换5位日期,oracle,date,julian-date,Oracle,Date,Julian Date,我有一个Oracle数据库表,其中包含5位Julian日期,我需要将其转换为日期时间格式 样本数据 Source Actual date 40786 -> 2015-09-01 | 40785 -> 2015-08-31 | 首先,我尝试了以下方法 SELECT to_char(to_date(to_char(40786), 'J'),'DD-MM-YYYY'), to_char(to_date(to_char(40785), 'J'),'DD-MM-Y

我有一个Oracle数据库表,其中包含5位Julian日期,我需要将其转换为日期时间格式

样本数据

Source  Actual date
40786 ->    2015-09-01 |
40785 ->    2015-08-31 |
首先,我尝试了以下方法

SELECT to_char(to_date(to_char(40786), 'J'),'DD-MM-YYYY'),
       to_char(to_date(to_char(40785), 'J'),'DD-MM-YYYY')
  FROM dual; 

40786 ->    4601-09-01 |
40785 ->    4601-08-31 |
因为它是错误的,所以我计算了天数的差异(2416481),并制定了以下查询

SELECT to_char(to_date(to_char(40786 + 2416481  ), 'J'),'DD-MM-YYYY'),
       to_char(to_date(to_char(40785 + 2416481), 'J'),'DD-MM-YYYY')  
  FROM dual; 

40786 ->    2015-09-01 |
40785 ->    2015-08-31 |
这两天是正确的,但该表自2010年以来就有历史记录。上述调整是否在整个历史记录中保持正确。i、 周末、闰年等

非常感谢。
V

您的问题是该列未存储在Julian date中。所以你不能问转换是否有效。 似乎日期是基于1904年1月1日(=零日)

因此,转换如下:

 select to_date('1904-01-01','yyyy-mm-dd') + 40786 as dt from dual;

 DT
 ---------- 
 01.09.2015

 select to_date('1904-01-01','yyyy-mm-dd') + 40785 as dt from dual;

 DT
 ---------- 
 31.08.2015
如果它真的能工作,你只能回答GUI转换例程中的代码


是的,如果你信任rational软件开发,你可以期待它会工作(比如说在+/-100年的时间范围内)。

如果源数据一开始就错了,那么你对所有其他记录都会一直错有什么信心?我的意思是,你怎么知道所有其他记录都有完全相同的日期偏移量(2416481)?首先,我会仔细看看为什么日期是错误的,并确保这不仅仅是对你的原始数据的误解。嗨,谢谢你的快速回复。让我澄清一下。源数据已被系统使用,并随着时间的推移进行了验证。所以数据是正确的。但是我不知道他们使用的转换方法。(有一个显示正确格式的GUI)我猜日期被2416481天抵消了,因为它在最近几天似乎工作正常。如果你找到一组朱利安格式的日期,并且只能交叉检查最后几天,你会用已知日期得出的偏移量来抵消所有日期,还是有更聪明的方法来抵消这些日期?我似乎记得1904有时在Excel中使用,以避免混淆1900是否是闰年,但在这两者之间存在着潜在的问题。所以我猜OP的后续问题是数据来自何处,如果数据来源总是基于1904年而不是1900年。(哈,)非常感谢。这更有意义。我认为这就是解决办法。观察力强@Alex;我首先感到困惑的是没有找到1900年。这是有道理的!