繁体   English   中英

如何在 Oracle SQL 中将 excel 序列日期数字转换为日期

[英]how to convert excel serial date number to date in Oracle SQL

我试图将相同的 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。

您仅差 1。使用30 Dec 1899 (而不是31 Dec 1899 )作为索引 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 年视为闰年,即使它不是。 因此,Excel 也有 1900 年 2 月 29 日的数字,该数字不存在。

如果我理解正确,您可以尝试使用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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM