Google Sheets的DATEVALUE函数在PostgreSQL中的等效实现
在PostgreSQL中实现Google Sheets DATEVALUE函数的等效逻辑
PostgreSQL没有直接对应Google Sheets DATEVALUE的内置函数,但可以通过计算目标日期与Google Sheets日期系统的基准日之间的天数差来实现相同结果。
原理说明
Google Sheets的DATEVALUE函数将日期转换为以1899年12月30日为起点的天数(因Google Sheets存在1900年闰年的历史bug,实际基准并非1900年1月1日)。例如DATEVALUE('2023-18-05')得到45064,本质是计算2023年5月18日与1899年12月30日之间的天数差。
实现方法
在PostgreSQL中,通过以下步骤实现:
- 将输入的日期字符串转换为
date类型(需匹配实际日期格式); - 计算该日期与基准日
'1899-12-30'::date的天数差,转换为整数即可得到与DATEVALUE一致的结果。
示例代码
针对你的例子,输入日期格式为YYYY-DD-MM,对应SQL语句:
SELECT (TO_DATE('2023-18-05', 'YYYY-DD-MM') - '1899-12-30'::date)::INT;
执行后将返回45064,与Google Sheets的输出完全一致。
注意事项
- 日期格式适配:如果你的日期字符串格式不同(如
MM/DD/YYYY),需调整TO_DATE函数的第二个参数,例如TO_DATE('05/18/2023', 'MM/DD/YYYY'); - 旧日期兼容:若需处理1900年3月1日之前的日期,需额外修正Google Sheets的闰年bug(该bug错误地将1900年视为闰年,导致这一天之前的日期计算差1天),可通过条件判断调整:
SELECT CASE WHEN target_date < '1900-03-01'::date THEN (target_date - '1899-12-30'::date)::INT + 1 ELSE (target_date - '1899-12-30'::date)::INT END AS datevalue FROM (SELECT TO_DATE('1900-02-28', 'YYYY-MM-DD') AS target_date) t;
内容的提问来源于stack exchange,提问作者Teja Goud Kandula
相关产品推荐
相关产品推荐

