在PostgreSQL中从部分日期值生成完整日期
PostgreSQL 从部分日期值生成完整日期
正确实现方案
你的需求是将date_col1(格式如APR-12)和date_col2(格式如2012)拼接成当月1日的完整日期(比如2012-04-01)。原来的语句用了SQL Server专属语法(比如CHARINDEX、+拼接),PostgreSQL不支持,这里给出两种可靠的实现方式:
方法1:字符串拼接后用TO_DATE转换
这是最简洁的实现方式,直接拼接成标准日期字符串后解析:
SELECT TO_DATE('01-' || date_col1 || '-' || date_col2, 'DD-Mon-YYYY') AS date_goal FROM your_table;
- 逻辑:先拼接出
01-APR-2012格式的字符串,再通过TO_DATE函数按DD-Mon-YYYY格式解析为日期类型,自动得到当月1日的日期。 - 注意:
Mon格式符支持三位月份缩写,大小写不敏感,APR、apr这类写法都能正确识别。
方法2:用MAKE_DATE分步构造日期
如果需要更清晰的分步逻辑,可以拆分月份信息后构造日期:
SELECT MAKE_DATE( date_col2::INTEGER, TO_CHAR(TO_DATE(SUBSTRING(date_col1 FROM 1 FOR 3), 'Mon'), 'MM')::INTEGER, 1 ) AS date_goal FROM your_table;
- 逻辑:
- 从
date_col1中提取前三位月份缩写(比如APR),转成日期后提取对应的月份数字(04); - 将
date_col2转为整数作为年份; - 用
MAKE_DATE函数直接构造出年-月-1的完整日期。
- 从
原语句的问题说明
你原来的语句依赖SQL Server专属语法:
- PostgreSQL中字符串拼接用
||而非+; CHARINDEX在PostgreSQL中对应STRPOS或POSITION函数,但你的替换逻辑容易导致格式错误,不如直接用日期函数解析可靠。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

