如何在SQL中通过起始日期、开始时间与结束时间计算事件结束日期
实现思路
核心判断逻辑如下:
比较EventEndTime和EventStartTime的大小:
- 如果
EventEndTime>EventStartTime:说明事件当天结束,EventEndDate等于原EventDate - 如果
EventEndTime<EventStartTime:说明事件跨天,EventEndDate等于原EventDate加1天
注意需要先把EventDate从DD/MM/YYYY格式的字符串转为对应数据库的日期类型,避免字符串运算出错。如果你的表中字段已经是日期、时间类型,可以直接跳过格式转换步骤。
不同数据库实现示例
MySQL 代码
SELECT EventDate, EventStartTime, EventEndTime, DATE_FORMAT( CASE WHEN STR_TO_DATE(EventEndTime, '%H:%i') > STR_TO_DATE(EventStartTime, '%H:%i') THEN STR_TO_DATE(EventDate, '%d/%m/%Y') ELSE DATE_ADD(STR_TO_DATE(EventDate, '%d/%m/%Y'), INTERVAL 1 DAY) END, '%d/%m/%Y' ) AS EventEndDate FROM 你的表名;
PostgreSQL 代码
SELECT EventDate, EventStartTime, EventEndTime, TO_CHAR( CASE WHEN EventEndTime::time > EventStartTime::time THEN TO_DATE(EventDate, 'DD/MM/YYYY') ELSE TO_DATE(EventDate, 'DD/MM/YYYY') + INTERVAL '1 day' END, 'DD/MM/YYYY' ) AS EventEndDate FROM 你的表名;
SQL Server 代码
SELECT EventDate, EventStartTime, EventEndTime, FORMAT( CASE WHEN CAST(EventEndTime AS TIME) > CAST(EventStartTime AS TIME) THEN CONVERT(DATE, EventDate, 103) -- 103对应DD/MM/YYYY格式编码 ELSE DATEADD(DAY, 1, CONVERT(DATE, EventDate, 103)) END, 'dd/MM/yyyy' ) AS EventEndDate FROM 你的表名;
内容的提问来源于stack exchange,提问作者Jasmine.V
相关产品推荐
相关产品推荐

