You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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á

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:57:03