简体   繁体   English

在 MySQL 中创建一个时间(半小时)表

[英]Create a time (by half hours) table in MySQL

For reporting purposes I need a Time table that acts as a lookup table that lists every half hour in a day.出于报告目的,我需要一个时间表作为查找表,每天每半小时列出一次。 It will function the same way as a date table except it's time.除了时间之外,它的功能与日期表相同。

I found a great example of a 24 hour table:我发现了一个很好的 24 小时制表示例:

    CREATE TABLE hourly_data
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    date DATE NOT NULL,
    hour INT NOT NULL,
    f1 INT NOT NULL,
    f2 INT NOT NULL,
    f3 INT NOT NULL,
    f4 INT NOT NULL,
    f5 INT NOT NULL,
    f6 INT NOT NULL,
    inserted timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

But I would rather it be every half hour.但我宁愿每半小时一次。 Any ideas on how to do this?关于如何做到这一点的任何想法? This would help with shifts and create specialized reports.这将有助于轮班并创建专门的报告。 Thanks in advance!提前致谢!

in mariadb you can direct use the sequence Engine like this:在 mariadb 中,您可以像这样直接使用序列引擎:

SELECT
  date('2010/01/01') + interval (seq * 30) Minute as mydate
FROM seq_0_to_10;

Sample样品

MariaDB [mysql]> select date('2010/01/01') + interval (seq * 30) Minute as mydate from seq_0_to_10;
+---------------------+
| mydate              |
+---------------------+
| 2010-01-01 00:00:00 |
| 2010-01-01 00:30:00 |
| 2010-01-01 01:00:00 |
| 2010-01-01 01:30:00 |
| 2010-01-01 02:00:00 |
| 2010-01-01 02:30:00 |
| 2010-01-01 03:00:00 |
| 2010-01-01 03:30:00 |
| 2010-01-01 04:00:00 |
| 2010-01-01 04:30:00 |
| 2010-01-01 05:00:00 |
+---------------------+
11 rows in set (0.00 sec)

MariaDB [mysql]>

old way without SEQUENCE Engine没有序列引擎的旧方法

SELECT
  DATE('2010/01/01') + INTERVAL (NR * 30) MINUTE AS mydate
FROM (
  SELECT d2.a*10+d1.a  AS nr FROM (
   SELECT 0  a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
   UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8  UNION ALL SELECT 9) AS d1
   CROSS JOIN (
   SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4  ) AS d2
WHERE d2.a*10+d1.a BETWEEN 0 AND 47
) AS parameter
ORDER BY nr;

sample样品

MariaDB [(none)]> SELECT
    ->   DATE('2010/01/01') + INTERVAL (NR * 30) MINUTE AS mydate
    -> FROM (
    ->   SELECT d2.a*10+d1.a  AS nr FROM (
    ->    SELECT 0  a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
    ->    UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8  UNION ALL SELECT 9) AS d1
    ->    CROSS JOIN (
    ->    SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4  ) AS d2
    -> WHERE d2.a*10+d1.a BETWEEN 0 AND 47
    -> ) AS parameter
    -> ORDER BY nr;
+---------------------+
| mydate              |
+---------------------+
| 2010-01-01 00:00:00 |
| 2010-01-01 00:30:00 |
| 2010-01-01 01:00:00 |
| 2010-01-01 01:30:00 |
| 2010-01-01 02:00:00 |
| 2010-01-01 02:30:00 |
| 2010-01-01 03:00:00 |
| 2010-01-01 03:30:00 |
| 2010-01-01 04:00:00 |
| 2010-01-01 04:30:00 |
| 2010-01-01 05:00:00 |
| 2010-01-01 05:30:00 |
| 2010-01-01 06:00:00 |
| 2010-01-01 06:30:00 |
| 2010-01-01 07:00:00 |
| 2010-01-01 07:30:00 |
| 2010-01-01 08:00:00 |
| 2010-01-01 08:30:00 |
| 2010-01-01 09:00:00 |
| 2010-01-01 09:30:00 |
| 2010-01-01 10:00:00 |
| 2010-01-01 10:30:00 |
| 2010-01-01 11:00:00 |
| 2010-01-01 11:30:00 |
| 2010-01-01 12:00:00 |
| 2010-01-01 12:30:00 |
| 2010-01-01 13:00:00 |
| 2010-01-01 13:30:00 |
| 2010-01-01 14:00:00 |
| 2010-01-01 14:30:00 |
| 2010-01-01 15:00:00 |
| 2010-01-01 15:30:00 |
| 2010-01-01 16:00:00 |
| 2010-01-01 16:30:00 |
| 2010-01-01 17:00:00 |
| 2010-01-01 17:30:00 |
| 2010-01-01 18:00:00 |
| 2010-01-01 18:30:00 |
| 2010-01-01 19:00:00 |
| 2010-01-01 19:30:00 |
| 2010-01-01 20:00:00 |
| 2010-01-01 20:30:00 |
| 2010-01-01 21:00:00 |
| 2010-01-01 21:30:00 |
| 2010-01-01 22:00:00 |
| 2010-01-01 22:30:00 |
| 2010-01-01 23:00:00 |
| 2010-01-01 23:30:00 |
+---------------------+
48 rows in set (0.00 sec)

I could not get the initial answer to work in MYSQL but by breaking down the second old school way.我无法获得在 MYSQL 中工作的最初答案,而是打破了第二种老派方式。 I replaced all the unions using the following query:我使用以下查询替换了所有联合:

WITH RECURSIVE seq AS (SELECT 0 AS value UNION ALL SELECT value + 1 FROM seq WHERE value < 47) SELECT * FROM seq;

I then adjusted the initial query to use the above query to get the result:然后我调整了初始查询以使用上面的查询来得到结果:

WITH RECURSIVE seq AS (SELECT 0 AS value UNION ALL SELECT value + 1 FROM seq WHERE value < 47) SELECT DATE('2010/01/01') + INTERVAL (value * 30) MINUTE AS mydate FROM seq AS parameter ORDER BY value;

For just a list of times:仅列出时间:

WITH RECURSIVE seq AS (SELECT 0 AS value UNION ALL SELECT value + 1 FROM seq WHERE value < 47 ) select time(DATE('2010/01/01') + INTERVAL (value * 30) minute) AS Time FROM seq AS parameter ORDER BY value;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM