SQL创建数据表时如何根据出生日期计算年龄?AS语法报错如何解决
问题原因
你写的计算列语法是SQL Server专属语法,其他数据库不支持该格式的AS定义,所以会触发语法报错。
对应数据库修复方案
- MySQL 5.7+
需要补充GENERATED ALWAYS关键字,可指定VIRTUAL(查询时计算,不持久化存储,默认值)或者STORED(写入时计算,持久化存储):
CREATE TABLE patients ( PatientID int PRIMARY KEY NOT NULL, FirstName varchar(40) NOT NULL, LastName varchar(40) NOT NULL, PatientBirthday date, PatientAge int GENERATED ALWAYS AS (YEAR(CURRENT_TIMESTAMP) - YEAR(PatientBirthday)) VIRTUAL );
- PostgreSQL
必须指定STORED属性,同时当前日期建议用CURRENT_DATE减少冗余的时分秒处理:
CREATE TABLE patients ( PatientID int PRIMARY KEY NOT NULL, FirstName varchar(40) NOT NULL, LastName varchar(40) NOT NULL, PatientBirthday date, PatientAge int GENERATED ALWAYS AS (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM PatientBirthday)) STORED );
- Oracle
补充GENERATED ALWAYS关键字即可,无需额外属性:
CREATE TABLE patients ( PatientID int PRIMARY KEY NOT NULL, FirstName varchar(40) NOT NULL, LastName varchar(40) NOT NULL, PatientBirthday date, PatientAge int GENERATED ALWAYS AS (EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM PatientBirthday)) );
额外建议
仅用年份差计算年龄的逻辑不严谨,比如当前为2024年1月1日,用户生日为2023年12月31日,差值为1但实际年龄不足1岁。如果对年龄准确性有要求,更建议查询时通过数据库内置的日期差函数计算,无需提前存储为表字段。
内容的提问来源于stack exchange,提问作者Lyle Ginlat
相关产品推荐
相关产品推荐

