【问题标题】:How to create a column in MySQL8 to hold time in 24 hour format如何在 MySQL 8 中创建一列以 24 小时格式保存时间
【发布时间】:2020-12-19 00:25:53
【问题描述】:

我正在尝试将一些数据插入 MySQL 8 数据库的列中。 该表旨在为一周中每一天的每个小时保存一个时间段的 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 脚本将数据传播到表中

    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 表语句,我可以,因为这只是在我的测试设置中。我只需要一些关于我公然失踪的指针。

【问题讨论】:

    标签: python mysql datetime sql-insert create-table


    【解决方案1】:

    如果您想存储时间,请不要使用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'),因此它可以像间隔一样使用。

    【讨论】:

    • 星期几最好存储为整数 0-6 或 1-7
    • 感谢您的指点。我在看 TIME 函数,但我认为它是一个计时函数,所以通过了几次。下次我会看起来更好。
    【解决方案2】:

    您可以将列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 行,一周中的每一天 24 行,您需要 2 个递归 CTEs。
    第一个将返回一周中的几天,第二个将返回一天中的所有时间。
    这些CTEs 必须加入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

    【讨论】:

    • 谢谢你。这确实帮助了我的理解,也指出我还有很多东西要学
    • 我该怎么做。我以为我有
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多