如何在 table 的新列中执行 SQL INSERT 并转换为数据类型 DATETIME
How to do a SQL INSERT of a timestamp in new column of table with cast to data type DATETIME
我有一个 table,其列 'TIMESTAMP' 的数据类型为 VARCHAR:
CREATE TABLE Table1
(`ID` int, `TIMESTAMP` varchar(24), `TOPIC` varchar(30), `PAYLOAD` numeric, `UNIT` varchar(5), `SENSOR` varchar(25), `DerivedValue` int, `DerivedValueDesc` varchar(17))
;
INSERT INTO Table1
(`ID`, `TIMESTAMP`, `TOPIC`, `PAYLOAD`, `UNIT`, `SENSOR`, `DerivedValue`, `DerivedValueDesc`)
VALUES
(17463, '2019-11-28T17:58:12.776Z', 'Wago-855-9150', 475.29334, 'W', '"Wago 855-9150/2000-0701"', 1, '"Produktion ja"'),
(17464, '2019-11-28T17:58:13.675Z', 'ifm-O5D150', 19.0625, 'cm', '"ifm O5D150"', 1, '"Tür offen"'),
(17465, '2019-11-28T17:58:13.675Z', 'Keyence-FD-Q20C', 0, 'L/min', '"Keyence FD-Q20C"', 0, '"Durchfluss nein"'),
(17466, '2019-11-28T17:58:14.676Z', 'ifm-O5D150', 23.0625, 'cm', '"ifm O5D150"', 0, '"Tür zu"'),
(17467, '2019-11-28T17:58:14.676Z', 'Keyence-FD-Q20C', 0, 'L/min', '"Keyence FD-Q20C"', 0, '"Durchfluss nein"'),
(17468, '2019-11-28T17:58:14.776Z', 'Wago-855-9150', 569.14666, 'W', '"Wago 855-9150/2000-0701"', 1, '"Produktion ja"')
;
现在发现查询table非常耗时:
SELECT PAYLOAD FROM Table1 WHERE TOPIC LIKE '%temperature%' AND CAST(TIMESTAMP AS datetime) between '2019-09-29 00:00:00' and '2019-09-29 00:59:59';
所以我们的想法是创建一个额外的列并将时间戳存储在 DATETIME 数据类型中:
ALTER TABLE Table1 ADD `DATETIME` DATETIME AFTER `TIMESTAMP`;
然后我想用 TIMESTAMP 列中转换后的数据填充新列:
INSERT INTO Table1(DATETIME) SELECT CAST(`TIMESTAMP` AS DATETIME) FROM Table1;
然后我收到错误信息:
Error: ER_TRUNCATED_WRONG_VALUE: Truncated incorrect datetime value:
'2019-11-28T17:58:12.776Z'
我在 https://www.db-fiddle.com/ and http://sqlfiddle.com/ 中制作查询原型时遇到此错误。我正在使用 MySQL 数据库 v5.7.
有趣的是,这个查询有效:
SELECT `TIMESTAMP`, CAST(`TIMESTAMP` AS DATETIME) AS `MYDATETIME` FROM Table1;
但我需要新列中的数据,而不是查询中的数据。
我的错误是什么?我认为最好不要像 STR_TO_DATE 这样的字符串操作,因为对秒的舍入有不确定的后果。
唯一不同意 MySQL 的 date literal format 的部分是最后的 'Z'
。
mysql> select cast('2019-11-28T17:58:12.776Z' as datetime);
+----------------------------------------------+
| cast('2019-11-28T17:58:12.776Z' as datetime) |
+----------------------------------------------+
| 2019-11-28 17:58:13 |
+----------------------------------------------+
1 row in set, 1 warning (0.00 sec)
Warning (Code 1292): Truncated incorrect datetime value: '2019-11-28T17:58:12.776Z'
但是修剪 'Z'
就可以了:
mysql> select cast(trim(trailing 'Z' from '2019-11-28T17:58:12.776Z') as datetime);
+----------------------------------------------------------------------+
| cast(trim(trailing 'Z' from '2019-11-28T17:58:12.776Z') as datetime) |
+----------------------------------------------------------------------+
| 2019-11-28 17:58:13 |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)
如果要保留毫秒数,则转换为 datetime(3)
:
mysql> select cast(trim(trailing 'Z' from '2019-11-28T17:58:12.776Z') as datetime(3));
+-------------------------------------------------------------------------+
| cast(trim(trailing 'Z' from '2019-11-28T17:58:12.776Z') as datetime(3)) |
+-------------------------------------------------------------------------+
| 2019-11-28 17:58:12.776 |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
我有一个 table,其列 'TIMESTAMP' 的数据类型为 VARCHAR:
CREATE TABLE Table1
(`ID` int, `TIMESTAMP` varchar(24), `TOPIC` varchar(30), `PAYLOAD` numeric, `UNIT` varchar(5), `SENSOR` varchar(25), `DerivedValue` int, `DerivedValueDesc` varchar(17))
;
INSERT INTO Table1
(`ID`, `TIMESTAMP`, `TOPIC`, `PAYLOAD`, `UNIT`, `SENSOR`, `DerivedValue`, `DerivedValueDesc`)
VALUES
(17463, '2019-11-28T17:58:12.776Z', 'Wago-855-9150', 475.29334, 'W', '"Wago 855-9150/2000-0701"', 1, '"Produktion ja"'),
(17464, '2019-11-28T17:58:13.675Z', 'ifm-O5D150', 19.0625, 'cm', '"ifm O5D150"', 1, '"Tür offen"'),
(17465, '2019-11-28T17:58:13.675Z', 'Keyence-FD-Q20C', 0, 'L/min', '"Keyence FD-Q20C"', 0, '"Durchfluss nein"'),
(17466, '2019-11-28T17:58:14.676Z', 'ifm-O5D150', 23.0625, 'cm', '"ifm O5D150"', 0, '"Tür zu"'),
(17467, '2019-11-28T17:58:14.676Z', 'Keyence-FD-Q20C', 0, 'L/min', '"Keyence FD-Q20C"', 0, '"Durchfluss nein"'),
(17468, '2019-11-28T17:58:14.776Z', 'Wago-855-9150', 569.14666, 'W', '"Wago 855-9150/2000-0701"', 1, '"Produktion ja"')
;
现在发现查询table非常耗时:
SELECT PAYLOAD FROM Table1 WHERE TOPIC LIKE '%temperature%' AND CAST(TIMESTAMP AS datetime) between '2019-09-29 00:00:00' and '2019-09-29 00:59:59';
所以我们的想法是创建一个额外的列并将时间戳存储在 DATETIME 数据类型中:
ALTER TABLE Table1 ADD `DATETIME` DATETIME AFTER `TIMESTAMP`;
然后我想用 TIMESTAMP 列中转换后的数据填充新列:
INSERT INTO Table1(DATETIME) SELECT CAST(`TIMESTAMP` AS DATETIME) FROM Table1;
然后我收到错误信息:
Error: ER_TRUNCATED_WRONG_VALUE: Truncated incorrect datetime value: '2019-11-28T17:58:12.776Z'
我在 https://www.db-fiddle.com/ and http://sqlfiddle.com/ 中制作查询原型时遇到此错误。我正在使用 MySQL 数据库 v5.7.
有趣的是,这个查询有效:
SELECT `TIMESTAMP`, CAST(`TIMESTAMP` AS DATETIME) AS `MYDATETIME` FROM Table1;
但我需要新列中的数据,而不是查询中的数据。
我的错误是什么?我认为最好不要像 STR_TO_DATE 这样的字符串操作,因为对秒的舍入有不确定的后果。
唯一不同意 MySQL 的 date literal format 的部分是最后的 'Z'
。
mysql> select cast('2019-11-28T17:58:12.776Z' as datetime);
+----------------------------------------------+
| cast('2019-11-28T17:58:12.776Z' as datetime) |
+----------------------------------------------+
| 2019-11-28 17:58:13 |
+----------------------------------------------+
1 row in set, 1 warning (0.00 sec)
Warning (Code 1292): Truncated incorrect datetime value: '2019-11-28T17:58:12.776Z'
但是修剪 'Z'
就可以了:
mysql> select cast(trim(trailing 'Z' from '2019-11-28T17:58:12.776Z') as datetime);
+----------------------------------------------------------------------+
| cast(trim(trailing 'Z' from '2019-11-28T17:58:12.776Z') as datetime) |
+----------------------------------------------------------------------+
| 2019-11-28 17:58:13 |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)
如果要保留毫秒数,则转换为 datetime(3)
:
mysql> select cast(trim(trailing 'Z' from '2019-11-28T17:58:12.776Z') as datetime(3));
+-------------------------------------------------------------------------+
| cast(trim(trailing 'Z' from '2019-11-28T17:58:12.776Z') as datetime(3)) |
+-------------------------------------------------------------------------+
| 2019-11-28 17:58:12.776 |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)