创建表时能否将两日期列的天数差存入同表新列?附SQL示例
问题解答
可以实现该需求,你需要使用计算列(生成列) 语法完成操作,不同数据库的写法略有差异,以下是具体说明:
原有代码问题
你写的列定义缺少计算列的声明关键字,直接写表达式属于不合法的建表语法。
各数据库正确实现方案
从你使用的IDENTITY语法判断你大概率使用的是SQL Server,优先提供SQL Server的正确写法:
- SQL Server 实现
直接在列定义前加AS关键字即可,数据库会自动推导数据类型:
create table Leave ( LeaveID int unique IDENTITY(555, 1), EmpID int foreign key references Employee(ID), From_Date date, To_Date date, Days AS DATEDIFF(day, From_Date, To_Date) );
如果需要把计算结果持久化存储(而非每次查询时实时计算),可以追加PERSISTED关键字:
Days AS DATEDIFF(day, From_Date, To_Date) PERSISTED
- MySQL 实现
需要用GENERATED ALWAYS AS声明,可选VIRTUAL(实时计算,默认值)或STORED(持久化存储):
create table Leave ( LeaveID int unique AUTO_INCREMENT, EmpID int, From_Date date, To_Date date, Days int GENERATED ALWAYS AS (DATEDIFF(To_Date, From_Date)) STORED, foreign key (EmpID) references Employee(ID) );
- PostgreSQL 实现
使用GENERATED ALWAYS AS声明,持久化存储需要加STORED:
create table Leave ( LeaveID serial unique, EmpID int references Employee(ID), From_Date date, To_Date date, Days int GENERATED ALWAYS AS (To_Date - From_Date) STORED );
注意事项
- 计算列不支持手动插入、更新值,数值会随关联的
From_Date、To_Date字段自动更新 - 非持久化的计算列不占用存储空间,查询时实时计算,适合字段修改频繁的场景;持久化计算列占用存储空间,适合查询频率高、字段修改少的场景
内容的提问来源于stack exchange,提问作者codingworld
相关产品推荐
相关产品推荐

