如何在 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 个递归 CTE
s。
第一个将 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。
我正在尝试将一些数据插入 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 个递归 CTE
s。
第一个将 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。