MySQL计算日期与次日18点时间差判断审批是否按时的实现问题
实现方案
你原有写法存在两个问题:
- 仅给
created_at加1天得到的是对应24小时后的时间,不是你需要的次日18点 - 多数数据库的
DATEDIFF仅计算日期天数差,会忽略时分秒,无法精确判断时间差
核心思路:不用先计算时间差再对比,直接构造出「created_at对应次日18点」的时间点,直接和approved_at比大小即可,逻辑更简单且性能更好。
MySQL 实现
CASE WHEN approved_at > TIMESTAMP(DATE_ADD(DATE(created_at), INTERVAL 1 DAY), '18:00:00') THEN 1 ELSE 0 END AS is_overdue
说明:先用DATE(created_at)提取创建时间的日期部分,加1天后拼接18:00:00得到次日18点的完整时间戳,直接和审批时间对比即可。
PostgreSQL 实现
CASE WHEN approved_at > (DATE(created_at) + INTERVAL '1 day' + INTERVAL '18 hours') THEN 1 ELSE 0 END AS is_overdue
SQL Server 实现
CASE WHEN approved_at > DATEADD(HOUR, 18, DATEADD(DAY, 1, CAST(created_at AS DATE))) THEN 1 ELSE 0 END AS is_overdue
如果你的场景必须要计算时间差再对比,以MySQL为例写法如下:
CASE WHEN TIMESTAMPDIFF(SECOND, created_at, approved_at) > TIMESTAMPDIFF(SECOND, created_at, TIMESTAMP(DATE_ADD(DATE(created_at), INTERVAL 1 DAY), '18:00:00')) THEN 1 ELSE 0 END AS is_overdue
用秒级差值对比可以避免跨天、时分秒精度丢失的问题。
内容的提问来源于stack exchange,提问作者Pedro Sá
相关产品推荐
相关产品推荐

