如何在SQL中新增列计算START与END日期的差值
实现方案:计算日期差值并新增列
根据你的需求,分两种场景给出实现方案,覆盖主流数据库:
一、查询时临时生成差值列(不修改表结构)
如果只是需要在查询结果中展示日期差,不需要永久修改表结构,直接在SELECT语句中计算即可:
MySQL
使用DATEDIFF()函数(结束日期在前,返回天数差):
SELECT *, DATEDIFF(`END DATE`, `START DATE`) AS date_diff FROM your_table_name;
PostgreSQL
可以直接用日期相减返回间隔,或者用AGE()函数提取天数:
SELECT *, -- 返回带单位的间隔(如 '5 days') (`END DATE` - `START DATE`) AS date_diff, -- 仅返回天数数值 EXTRACT(DAY FROM AGE(`END DATE`, `START DATE`))::INT AS date_diff_days FROM your_table_name;
SQL Server
DATEDIFF()参数顺序为「单位、开始日期、结束日期」:
SELECT *, DATEDIFF(day, [START DATE], [END DATE]) AS date_diff FROM your_table_name;
二、永久新增列并填充差值
如果需要把日期差作为永久列存储在表中,分两步操作:
MySQL
-- 1. 新增存储差值的列 ALTER TABLE your_table_name ADD COLUMN date_diff INT; -- 2. 计算并填充日期差 UPDATE your_table_name SET date_diff = DATEDIFF(`END DATE`, `START DATE`);
PostgreSQL
-- 1. 新增存储差值的列 ALTER TABLE your_table_name ADD COLUMN date_diff INT; -- 2. 计算并填充日期差 UPDATE your_table_name SET date_diff = EXTRACT(DAY FROM AGE(`END DATE`, `START DATE`))::INT;
SQL Server
-- 1. 新增存储差值的列 ALTER TABLE your_table_name ADD date_diff INT; -- 2. 计算并填充日期差 UPDATE your_table_name SET date_diff = DATEDIFF(day, [START DATE], [END DATE]);
补充说明
- 如果需要计算小时、分钟等其他单位的差值,只需替换对应函数的单位参数即可。比如MySQL用
TIMESTAMPDIFF(hour,START DATE,END DATE),SQL Server把DATEDIFF的day换成hour。 - 注意字段名包含空格,需要用反引号(MySQL)、方括号(SQL Server)或双引号(PostgreSQL需开启标准标识符模式)包裹,避免语法错误。
内容的提问来源于stack exchange,提问作者Vin
相关产品推荐
相关产品推荐

