如何在 MySQL8 中创建一个列来保存 24 小时格式的时间

How to create a column in MySQL8 to hold time in 24 hour format

我正在尝试将一些数据插入 MySQL 8 数据库的列中。 table 用于为一周中每一天的每个小时保存一个时间段的 id。所以我每天都有一个每小时 (tod) 的 id。

这是我自己的数据库,我边学边学。

我不知道如何将 24 小时时钟部分添加到列中

我是新手所以要温柔

这是我的 CREATE TABLE 语句:

CREATE TABLE IF NOT EXISTS `ctg`.`sections` (
    `id` INT NOT NULL,
    `day_of_week` VARCHAR(10) NULL DEFAULT NULL,
    `tod` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY(`id`))
    ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci

我正在通过一个非常简单的 python 脚本将数据传播到 table

    sqlstuff = "INSERT INTO sections(id,day_of_week,tod) VALUES (%s, %s, %s)"
    records = [
        (1,"Sunday",00.00),
        (2,"Sunday",01.00),
        (3,"Sunday",02.00),
        (4,"Sunday",03.00),
        (5,"Sunday",04.00),
        (6,"Sunday",05.00),
        ]

    db.executemany(sqlstuff, records)

    # Ensure we commit the tables
    mydb.commit()

    # Close the database
    db.close()

Python 脚本运行到 168 个 ID。可能是一种更快的方法,但我现在不在乎。 我尝试将 tod 格式设置为“01:00:00”及以上,但我不断收到 SQL 错误,指出“日期时间值不正确。

我已经阅读了很多关于时间、日期时间、时间戳和 time_format() 的 MySQL 8 内容,但无法弄清楚我在声明中需要什么来插入 1 -小时的时间段我需要。

如果我需要更改 CREATE table 语句,我可以,因为这一切都在我的测试设置中。我只需要一些关于我公然遗漏的指示。

如果要存储时间,请不要使用DATETIME,它顾名思义是将日期时间存储在一起。相反,使用 TIME 数据类型:

CREATE TABLE IF NOT EXISTS `ctg`.`sections` (
    `id` INT NOT NULL,
    `day_of_week` VARCHAR(10) NULL DEFAULT NULL,
    `tod` TIME NULL DEFAULT NULL,
    PRIMARY KEY(`id`)
);

然后,将正确的文字字符串传递给 INSERT 语句:

records = [
    (1, 'Sunday', '00:00:00'),
    (2, 'Sunday', '01:00:00'),
    (3, 'Sunday', '02:00:00'),
    (4, 'Sunday', '03:00:00'),
    (5, 'Sunday', '04:00:00'),
    (6, 'Sunday', '05:00:00'),
]

目前尚不清楚您将如何利用此设计。一周中的几个小时可能更好地存储为单个 TIME 列(范围从“-838:59:59”到“838:59:59”),因此它可以像间隔一样使用。

您可以将列 tod 的数据类型定义为 TIME
此外,id 列可以是 AUTO_INCREMENT,因此您无需为其提供值:

CREATE TABLE IF NOT EXISTS `sections` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `day_of_week` VARCHAR(10) NULL DEFAULT NULL,
    `tod` TIME NULL DEFAULT NULL
)ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci

要用 168 行填充 table,每周 24 行,您需要 2 个递归 CTEs。
第一个将 return 星期几,第二个将是一天中的所有时间。
这些 CTE 必须 CROSS 连接才能获得所有组合:

INSERT INTO sections(day_of_week, tod) 
WITH recursive 
  days AS (
    SELECT CURRENT_DATE date 
    UNION ALL
    SELECT date + interval 1 day 
    FROM days
    WHERE date < CURRENT_DATE + interval 6 day 
  ),
  hours AS (
    SELECT '00:00:00' time
    UNION ALL
    SELECT ADDTIME(time, '01:00:00') 
    FROM hours
    WHERE time < '23:00:00' 
  )
SELECT DAYNAME(d.date), h.time
FROM days d CROSS JOIN hours h
ORDER BY DAYOFWEEK(d.date), h.time

参见demo