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

标签 mysql date datetime mysql-5.5

出于报告目的,我需要一个时间表作为查找表,列出一天中每半小时的信息。除了时间之外,它的功能与日期表相同。

我找到了一个很好的 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
)

但我宁愿每半小时一次。关于如何做到这一点有什么想法吗?这将有助于轮类并创建专门的报告。提前致谢!

最佳答案

在mariadb中你可以直接使用序列引擎,如下所示:

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

示例

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]>

没有 SEQUENCE 引擎的旧方法

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;

示例

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)

关于mysql - 在MySQL中创建一个时间(半小时)表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36728475/

相关文章:

java - 解析日期并转换为 MYSQL 的 DATE?

ruby-on-rails - 是否可以使用 Rails 3 更改 MongoDB 中的默认时区?

javascript - 如何以秒为单位获取当前日期或/和时间

MYSQL - 设置子句不更新变量值

php - 通过php将带有日期的csv导入到mysql

mysql - 自定义属性字段在单页结帐 Magento 1.6 期间未保存到数据库?

sql - 如何计算 PostgreSQL 中多个日期范围内的出现次数

sql - 按月计算的值总和,其中数据包含开始日期和结束日期

php - 使用加入来显示轨道列表的轨道

mysql - 计算 MySQL 中时间重叠的重叠持续时间