如何将Excel序列号转换为Oracle SQL中的日期

时间:2018-11-08 09:22:50

标签: sql oracle oracle11g

我试图将相同的Excel日期格式转换为dd / mm / yyyy格式。但是我没有得到正确的结果。

43236   16-May-18
43249   29-May-18
43238   18-May-18
43228   8-May-18
43238   18-May-18

我正在使用以下查询

SELECT to_date('31-12-1899','dd-mm-yyyy')+43236 FROM dual UNION ALL SELECT to_date('31-12-1899','dd-mm-yyyy')+43249 FROM dual UNION ALL SELECT to_date('31-12-1899','dd-mm-yyyy')+43238 FROM dual UNION ALL SELECT to_date('31-12-1899','dd-mm-yyyy')+43228 FROM dual UNION ALL SELECT to_date('31-12-1899','dd-mm-yyyy')+43238 FROM dual;

我得到以下不正确的结果

17-MAY-18
30-MAY-18
19-MAY-18
09-MAY-18
19-MAY-18

请帮助我。我正在使用Oracle 11g R2。

3 个答案:

答案 0 :(得分:1)

您即将离开1。使用 1899年12月30日(而不是 1899年12月31日)作为索引0的参考日期。

SELECT to_date('31-12-1899','dd-mm-yyyy') + 43236 FROM dual

原因是1899年12月30日而不是1900年1月1日,这是双重原因:

  1. 在Excel中,1900年1月1日保存为1(而不是IT人员期望的0)。
  2. Excel认为1900年是a年,即使不是这样。因此,Excel中还有一个1900年2月29日的数字,该数字不存在。

答案 1 :(得分:0)

如果我的理解正确,您可以尝试使用TO_DATE并设置语言文化,然后使用TO_CHAR设置期望的格式。

select TO_CHAR(TO_DATE('16-May-18','DD-Mon-YY', 'nls_date_language = american'),'DD/mm/yyyy')
from dual

或这样。

SELECT TO_CHAR(to_date('31-12-1899','dd-mm-yyyy')+43236,'DD/mm/yyyy') FROM dual

sqlfiddle

答案 2 :(得分:0)

您可以在下面尝试使用to_char()函数

select to_char(TO_date('31-12-1899', 'dd-mm-yyyy')+43236,'DD/MM/YYYY')  from dual