【发布时间】:2018-04-04 13:43:55
【问题描述】:
我正在处理烛台图表数据。我有一个数据库表(MySql)与
created value
2017-09-25 17:55:04 3322.09
2017-09-25 18:00:03 3317.49
2017-09-25 18:05:02 3316.12
2017-09-25 18:10:03 3325.16
2017-09-25 18:15:04 3326.01
2017-09-25 18:20:03 3330.49
2017-09-25 18:25:04 3331.49
2017-09-25 18:30:04 3335.24
2017-09-25 18:35:03 3347.13
2017-09-25 18:40:03 3343.21
2017-09-25 18:45:05 3341.78
2017-09-25 18:50:03 3339.64
2017-09-25 18:55:04 3336.12
2017-09-25 19:00:04 3327.73
2017-09-25 19:05:03 3327.96
2017-09-25 19:10:04 3325.93
我正在尝试为任何时间段(例如 15 分钟或每 4 小时、每 6 天等)选择最大值、最小值、打开值、关闭值
到现在为止
SELECT p.created, HOUR(`DATE`), MAX(p.value), MIN(p.value)
FROM price
GROUP BY DATE(`DATE`),HOUR(`DATE`)
没那么复杂。它给了我每小时的最大值和最小值,所以对于分钟和“完整”时间段,如天、周、月,我可以使用 MONTH、DAY 等函数。
知道如何为任何时间段(比如 28 分钟或 31 小时等)构建查询吗?此外,这适用于最大值和最小值,但我还需要时间段的开盘值(第一个)和收盘值(最后一个)。
【问题讨论】:
-
查看stackoverflow.com/questions/7745609/…了解如何获取时间段的开盘和收盘值。
-
要获取特定时间段,请使用
WHERE created BETWEEN start_time AND end_time -
@Barmar - 不,请不要使用
BETWEEN。特别是当时间戳具有亚秒级精度时,最好使用独占上限 (<),以免发生意外情况。 -
@Jakub - 我通常喜欢构建一个临时/虚拟表(通常只是一个内联引用)的分组范围。这对于日历表和数字表来说是最简单的,但我们的想法是获得类似
(groupId=1, start='2014-01-01 00:00:00.000', end=start + 28 minutes)的内容,然后您可以对其进行分组,并且通常也有助于点击索引。