You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅已知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

问题根源

  1. 你使用的是PostgreSQL,但代码是MySQL专属语法:DATE_FORMAT、FROM_DAYS都是MySQL独有的函数,PostgreSQL不支持。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:13:23