Mysql 选择从早上6点到早上6点的行

Mysql 选择从早上6点到早上6点的行,mysql,Mysql,帮助创建一个查询,从表中选择从早上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-

帮助创建一个查询,从表中选择从早上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

你可以用这个,我会这么做的+10我会选择将连接条件放入ON子句中,并省略CROSS关键字。@spencer7593。参加继续。。当然是一个选项,可以节省9字节的代码。但对我来说,这样的交叉连接只是定义常量的一种方式,它可以在任何子句中多次重用。与使用SET@upper_limit=…-但要避免第二次询问。不管怎样,两种方法我都可以。当没有连接条件时,我通常会包含完全可选的交叉关键字,主要是为了提醒我和帮助未来的读者,没有连接条件是故意的,而不是疏忽。在这种情况下,t和r之间存在一个连接条件。。。但这只是个人喜好。。。我还可以看到使用CROSS关键字的意义,因为我们可以保证r只返回一行。省略叉号并将WHERE替换为ON仅仅是一种风格,不会改变查询。请注意一个边缘情况:2019-01-01 05:00:00您会期望什么?我们需要从早上6点到早上6点的最后一个完成时段。2019-01-01 05:00:00本期:2018-12-30 06:00:00-2018-12-31 06:00:00
SELECT start, start +interval 24 hour end
  FROM ( SELECT date(now()) 
                - interval if(hour(now())>6, 1, 2) day 
                + interval 6 hour 
                as start
       ) dates;