如何在RedShift中将5位儒略日期转换为标准日期?
RedShift中Excel日期序列号转标准日期的正确方法
你的问题核心是混淆了RedShift儒略日和Excel日期序列号的差异:
- RedShift的
to_date(..., 'J')使用的是儒略日系统,起点为公元前4713年1月1日,直接传入Excel的5位数值会得到错误的远古日期。 - 你使用的5位数值是Excel的日期序列号,起点为1900年1月1日(Excel存在历史bug,误将1900年视为闰年,序列号60对应不存在的1900-02-29)。
基础转换方案
利用两种日期系统的差值计算,将Excel序列号转换为RedShift认可的儒略日数值,再进行转换:
SELECT to_date((your_numeric_column - 1 + 2415020)::TEXT, 'J') AS standard_date FROM your_table;
验证示例
对于数值44950:44950 - 1 + 2415020 = 2459969,执行to_date('2459969', 'J')会返回2023-01-24,与Excel结果一致。
处理Excel的1900年闰年bug
如果你的数据中包含序列号60(Excel认为是1900-02-29,实际不存在),可以用CASE语句修正:
SELECT CASE WHEN your_numeric_column = 60 THEN '1900-03-01'::DATE ELSE to_date((your_numeric_column - 1 + 2415020)::TEXT, 'J') END AS standard_date FROM your_table;
内容的提问来源于stack exchange,提问作者Shawn van der Merwe
相关产品推荐
相关产品推荐

