如何在MySQL8中创建一列以24小时制保留时间

问题描述

我正在尝试将一些数据插入MySQL 8数据库中的COLUMN中。 该表旨在为一周中的每一天的每个小时保留一个时隙的ID。所以我每天有一个每小时的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,01.00),(3,02.00),(4,03.00),(5,04.00),(6,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表语句,我可以这样做,因为这一切都在我的测试设置上。我只需要一些有关我公然缺失的内容的指针。

解决方法

如果要存储时间,请勿使用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,'01:00:00'),(3,'02:00:00'),(4,'03:00:00'),(5,'04:00:00'),(6,'05:00:00'),] 语句:

TIME

目前还不清楚您将如何利用这种设计。最好将一周中的小时存储为单个{{1}}列(范围从'-838:59:59'到'838:59:59'),因此可以像间隔一样使用它。

,

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

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

要用168行(一周中的每天24行)填充表格,您需要2个递归CTE
第一个返回星期几,第二个返回一天中的所有小时。
必须将这些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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...