NOW() 和今天或昨天凌晨 3 点之间的记录

Records between NOW() and 3am today or yesterday

如何在 NOW() 和前一个凌晨 3 点之间的 table 中获取记录?

如果是上午 9 点,这会很容易,但如果是凌晨 2 点,我该如何写呢?即我想要 DATE_SUB(CURDATE(), INTERVAL 21 HOURS) 和 NOW() 之间的交易。我正在寻找一些可以同时执行这两项操作的代码,而无需检查用户代码中的时间并在两个 sql 语句之间进行选择。

我确定有一个简单的解决方案,但它让我望而却步。

一个简单的想法是减去三个小时并比较日期:

where date(date_sub(col, interval 3 hour)) = (case when hour(date) >= 3 then curdate() else date_sub(curdate(), interval 1 day)

或者,更明确地说,只需在 SQL 中进行比较:

where (hour(date) >= 3 and date(col) = curdate()) or
      (hour(date) < 3 and date(col) = date_sub(curdate(), interval 1 day)

我将添加我自己的答案(我最终放弃并探索使用 IF 并发现它可以在 SELECT 语句中使用),但@Gordon Linoff 可能更好 - 我不知道哪个其中速度更快。

SELECT IF (NOW() > DATE_ADD(CURDATE(), INTERVAL 3 HOUR),
           DATE_ADD(CURDATE(), INTERVAL 3 HOUR),
           DATE_SUB(CURDATE(), INTERVAL 21 HOUR))

然后可以用作外部 SELECT.

的条件