帮助创建一个查询,该查询将从表中选择过去一段时间(从早上6点到早上6点)的记录,该表有一个时间戳字段。
我将解释,例如:

Now: 2019-06-15 04:44:42
Period: 2019-06-13 06:00:00 - 2019-06-14 06:00:00

Now: 2019-06-15 07:44:42
Period: 2019-06-14 06:00:00 - 2019-06-15 06:00:00

Now: 2019-06-16 01:44:42
Period: 2019-06-14 06:00:00 - 2019-06-15 06:00:00

我想我不是最简单的要求:
SELECT * FROM `table` WHERE `timestamp`
    BETWEEN
        DATE_ADD(DATE(NOW() - INTERVAL '1 6' DAY_HOUR), INTERVAL 6 HOUR)
    AND
        DATE_ADD(DATE(NOW() - INTERVAL '0 6' DAY_HOUR), INTERVAL 6 HOUR);

有多简单?

最佳答案

您可以使用以下命令获取范围上限:

date(now() - INTERVAL 6 HOUR) + INTERVAL 6 HOUR

下限正好是提前一天(24小时):
date(now() - INTERVAL 6 HOUR) + INTERVAL 6 HOUR - INTERVAL 1 day

所以你的问题可能是:
SELECT *
FROM `table` t
WHERE t.timestamp >= date(now() - INTERVAL 6 HOUR) + INTERVAL 6 HOUR - INTERVAL 1 day
  AND t.timestamp <  date(now() - INTERVAL 6 HOUR) + INTERVAL 6 HOUR

但为了避免代码重复,我会将其重写为:
SELECT t.*
FROM `table` t
CROSS JOIN (
    SELECT date(now() - INTERVAL 6 HOUR) + INTERVAL 6 HOUR as upper_limit
) r -- r for "range"
WHERE t.timestamp >= r.upper_limit - INTERVAL 1 day
  AND t.timestamp <  r.upper_limit

您可以使用<= r.upper_limit而不是< r.upper_limit来获得与BETWEEN相同的结果。

09-28 04:03