仅已知year_birth(出生年份),如何用SQL填充age列?
解决PostgreSQL中通过出生年份计算年龄的SQL语法错误
问题场景
表marketing_data包含year_birth(整数类型出生年份)和空的age列,需用当前年份 - year_birth填充age列,执行MySQL风格SQL时触发报错:
-- 原错误语句 UPDATE marketing_data SET age = DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(),year_birth)), '%Y') + 0;
错误信息
ERROR: function datediff(timestamp with time zone, integer) does not exist
LINE 4: set age = DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(),year_birth)),...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 77
问题根源
- 你使用的是PostgreSQL,但代码是MySQL专属语法:
DATE_FORMAT、FROM_DAYS都是MySQL独有的函数,PostgreSQL不支持。 - PostgreSQL的
DATEDIFF要求两个参数均为日期/时间类型,而year_birth是整数,类型不匹配导致报错。
最简解决方案
既然已有直接的出生年份整数列,无需复杂日期转换,直接用当前年份减去year_birth即可:
UPDATE marketing_data SET age = EXTRACT(YEAR FROM CURRENT_DATE) - year_birth;
精准年龄计算(可选)
如果需要考虑当年生日未过的真实年龄(比如2024年3月时,1990年5月出生的人实际年龄为33而非34),可以用PostgreSQL的AGE函数,先将出生年份转为日期(假设生日为当年1月1日,可自行调整月份日期):
UPDATE marketing_data SET age = EXTRACT(YEAR FROM AGE(CURRENT_DATE, MAKE_DATE(year_birth, 1, 1)));
内容的提问来源于stack exchange,提问作者Paolo84
相关产品推荐
相关产品推荐

