我正在尝试为我正在进行的项目找出有效的查询。
我们将切换状态记录到表中,每次更改时,都会添加一个新值(0或1)。
这是表的简化结构:
day | hour | state
-----+------+-------
10 | 1 | 1 # day 10
10 | 6 | 0
10 | 21 | 1
11 | 3 | 0 # day 11
11 | 6 | 1
13 | 13 | 0 # day 13
....
现在我们需要进行每日概述,如下所示:
Day 11 : Switch was on during 0-3, 6-24
SELECT * FROM log WHERE day = 11
只会给我们[3,0]和[6,1]。从那些我们猜测它开始并开始结束,但第12天怎么样?
SELECT * FROM log WHERE day = 12
什么都没有,显然 - 没有任何线索可以猜测。
获得某一天的起始和结束状态的有效且可靠的方法是什么?类似“在第12天之前选择一个条目,在第12天之后选择一个”?
答案 0 :(得分:0)
SELECT
day,
hour,
state
FROM
log
WHERE
day*100+hour
BETWEEN
(SELECT max(day*100+hour) FROM log WHERE day < 12)
AND
(SELECT min(day*100+hour) FROM log WHERE day > 12)
将为您提供(包括)第12天之前的最后一个条目和第12天之后的第一个条目之间的所有内容。 如果您不需要知道状态何时发生变化,则第二部分可能是不必要的,并且足以知道状态在所选日期的至少午夜之前没有变化。