【发布时间】:2015-12-17 12:56:18
【问题描述】:
如何获取 NOW() 和之前凌晨 3 点之间的表中的记录?
如果是上午 9 点,这会很容易,但如果是凌晨 2 点,我该怎么写呢?即我想要 DATE_SUB(CURDATE(), INTERVAL 21 HOURS) 和 NOW() 之间的交易。我正在寻找一些代码,它可以同时执行这两种操作,而无需检查用户代码中的时间并在两个 sql 语句之间进行选择。
我确信有一个简单的解决方案,但它让我望而却步。
【问题讨论】:
如何获取 NOW() 和之前凌晨 3 点之间的表中的记录?
如果是上午 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 的条件。
【讨论】: