【问题标题】:MySQL One row for each hour 00:01:00 and 23:59:00 interval of the dayMySQL 每小时一行 00:01:00 和 23:59:00 一天的间隔
【发布时间】:2020-03-10 08:24:43
【问题描述】:

我试图在一天中的每个小时获得一行,我打算将某些数据加入其中。

我需要选择每天的 00:01:00 和 23:59:00 间隔时间。

我已尝试过此解决方案,但无法选择 00:01:00 和 23:59:00 间隔时间,而只能选择 00:00: 00 和 23:00:00 间隔小时。

如何解决这个问题?

你能帮帮我吗?

提前感谢您或任何帮助。

mysql> SELECT CONCAT(CURDATE(),' ','00:00') + INTERVAL (d0*10+d1) hour  AS mydate
FROM (
SELECT 0 AS d0 UNION SELECT 1 UNION SELECT 2
) AS t1
cross JOIN (
SELECT 0 AS d1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 ) AS t2
WHERE (d0*10+d1) < 24
order by d0,d1;
+---------------------+
| mydate              |
+---------------------+
| 2020-03-10 00:00:00 |
| 2020-03-10 01:00:00 |
| 2020-03-10 02:00:00 |
| 2020-03-10 03:00:00 |
| 2020-03-10 04:00:00 |
| 2020-03-10 05:00:00 |
| 2020-03-10 06:00:00 |
| 2020-03-10 07:00:00 |
| 2020-03-10 08:00:00 |
| 2020-03-10 09:00:00 |
| 2020-03-10 10:00:00 |
| 2020-03-10 11:00:00 |
| 2020-03-10 12:00:00 |
| 2020-03-10 13:00:00 |
| 2020-03-10 14:00:00 |
| 2020-03-10 15:00:00 |
| 2020-03-10 16:00:00 |
| 2020-03-10 17:00:00 |
| 2020-03-10 18:00:00 |
| 2020-03-10 19:00:00 |
| 2020-03-10 20:00:00 |
| 2020-03-10 21:00:00 |
| 2020-03-10 22:00:00 |
| 2020-03-10 23:00:00 |
+---------------------+
24 rows in set

编辑 01

我需要这个结果:

+---------------------+---------------------+
| start_date          | end_date            |
+---------------------+---------------------+
| 2020-03-10 00:01:00 | 2020-03-10 01:00:00 |
| 2020-03-10 01:01:00 | 2020-03-10 02:00:00 |
| 2020-03-10 02:01:00 | 2020-03-10 03:00:00 |
| 2020-03-10 03:01:00 | 2020-03-10 04:00:00 |
| 2020-03-10 04:01:00 | 2020-03-10 05:00:00 |
| 2020-03-10 05:01:00 | 2020-03-10 06:00:00 |
| 2020-03-10 06:01:00 | 2020-03-10 07:00:00 |
| 2020-03-10 07:01:00 | 2020-03-10 08:00:00 |
| 2020-03-10 08:01:00 | 2020-03-10 09:00:00 |
| 2020-03-10 09:01:00 | 2020-03-10 10:00:00 |
| 2020-03-10 10:01:00 | 2020-03-10 11:00:00 |
| 2020-03-10 11:01:00 | 2020-03-10 12:00:00 |
| 2020-03-10 12:01:00 | 2020-03-10 13:00:00 |
| 2020-03-10 13:01:00 | 2020-03-10 14:00:00 |
| 2020-03-10 14:01:00 | 2020-03-10 15:00:00 |
| 2020-03-10 15:01:00 | 2020-03-10 16:00:00 |
| 2020-03-10 16:01:00 | 2020-03-10 17:00:00 |
| 2020-03-10 17:01:00 | 2020-03-10 18:00:00 |
| 2020-03-10 18:01:00 | 2020-03-10 19:00:00 |
| 2020-03-10 19:01:00 | 2020-03-10 20:00:00 |
| 2020-03-10 20:01:00 | 2020-03-10 21:00:00 |
| 2020-03-10 21:01:00 | 2020-03-10 22:00:00 |
| 2020-03-10 22:01:00 | 2020-03-10 23:00:00 |
| 2020-03-10 23:01:00 | 2020-03-10 23:59:00 |
+---------------------+---------------------+

【问题讨论】:

  • 请向我们展示您期望的结果。
  • 您实际尝试过什么? “23:59:00 间隔时间”在哪里?
  • @GMB 请在我的第一个问题中查看 Edit 01
  • @NicoHaase 请在我的第一个问题中查看 Edit 01

标签: mysql sql date select


【解决方案1】:

您似乎正在尝试生成一个小时表。如果是这样,我建议输出两列:一列用于区间的下限(包括在内),另一列用于上限(应不包括在内)

SELECT 
    CURRENT_DATE + INTERVAL (d0 * 10 + d1) hour  AS start_date,
    CURRENT_DATE + INTERVAL (d0 * 10+d1 + 1) hour  AS end_date
FROM (SELECT 0 AS d0 UNION SELECT 1 UNION SELECT 2) AS t1
CROSS JOIN (
    SELECT 0 AS d1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 
) AS t2
WHERE (d0 * 10 + d1) < 24
ORDER BY d0,d1;

这个produces a resultset like:

开始日期 |结束日期 :----------------- | :----------------- 2020-03-10 00:00:00 | 2020-03-10 01:00:00 2020-03-10 01:00:00 | 2020-03-10 02:00:00 2020-03-10 02:00:00 | 2020-03-10 03:00:00 ... 2020-03-10 21:00:00 | 2020-03-10 22:00:00 2020-03-10 22:00:00 | 2020-03-10 23:00:00 2020-03-10 23:00:00 | 2020-03-11 00:00:00

然后您可以将其与原始表以半开间隔连接,如下所示:

SELECT ...
FROM myintervals i
LEFT JOIN mytable t 
    ON t.date >= i.start_date and t.date < i.end_date

这种方法的好处是它可以正确处理每个间隔的第一分钟和最后一分钟。


编辑:要生成您想要的确切结果,您可以:

SELECT 
    CURRENT_DATE 
        + INTERVAL (d0 * 10 + d1) hour 
        + INTERVAL 1 minute AS start_date,
    CURRENT_DATE 
        + INTERVAL (d0 * 10+d1 + 1) hour 
        - INTERVAL (case when d0 * 10+d1 = 23 THEN 1 ELSE 0 END) minute AS end_date
FROM (SELECT 0 AS d0 UNION SELECT 1 UNION SELECT 2) AS t1
CROSS JOIN (
    SELECT 0 AS d1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 
) AS t2
WHERE (d0 * 10 + d1) < 24
ORDER BY d0,d1;

Demo on DB Fiddle

【讨论】:

  • 谢谢,请在我的第一个问题中查看Edit 01
  • @Golia:是的,我看到了你的编辑。我仍然倾向于认为我的建议会更好地满足您的需求(如果不是,请解释)。
  • 非常感谢您的帮助,但我需要 00:00:00 的值在 start_date...
  • @Golia:你为什么要那个?
  • 因为我需要每天间隔 59 分钟的行
猜你喜欢
  • 2020-04-20
  • 2021-06-11
  • 2021-07-05
  • 2013-12-06
  • 2021-09-04
  • 2021-02-08
  • 1970-01-01
  • 2016-05-20
  • 2023-02-25
相关资源
最近更新 更多