问题描述
我正在尝试将一些数据插入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。