Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在转换为数据类型DATETIME的表的新列中执行时间戳的SQL插入_Mysql_Datetime_Casting_Insert - Fatal编程技术网

Mysql 如何在转换为数据类型DATETIME的表的新列中执行时间戳的SQL插入

Mysql 如何在转换为数据类型DATETIME的表的新列中执行时间戳的SQL插入,mysql,datetime,casting,insert,Mysql,Datetime,Casting,Insert,我有一个数据类型为VARCHAR的列“TIMESTAMP”的表: 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 Table

我有一个数据类型为VARCHAR的列“TIMESTAMP”的表:

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"')
;
现在发现查询表非常耗时:

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`; 
然后我想用来自列时间戳的转换数据填充新列:

INSERT INTO Table1(DATETIME) SELECT CAST(`TIMESTAMP` AS DATETIME) FROM Table1;
然后我得到错误消息:

错误:ER\u截断\u错误\u值:截断的日期时间值不正确: “2019-11-28T17:58:12.776Z”

在和中创建查询原型时出现此错误。我使用的是MySQL数据库v5.7

有趣的是,这个查询有效:

SELECT `TIMESTAMP`, CAST(`TIMESTAMP` AS DATETIME) AS `MYDATETIME` FROM Table1;
但我需要新列中的数据,而不是查询中的数据


我犯了什么错?我认为最好不要使用STR_to_DATE之类的字符串操作,因为秒的舍入结果不确定。

唯一与MySQL不一致的部分是末尾的
'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)


是对于新数据记录,我将创建一个新表,其中包含数据类型为DATETIME的列。但是我想保留现有的记录数据,因此我想转换现有的时间戳。当加载数据时,小注释
`PAYLOAD`numeric,
也会导致截断,因为
numeric
转换为
十进制(10,0)
也可能值得检查一下,在
传感器
DerivedValueDesc
列中存储双引号是否是一个好主意数字“有效负载”来自DB FIDLE导入的DLL文本。在真实数据库中是双重的。我还没有注意到的双引号,谢谢你。我几乎正确地从表1中选择了INSERT INTO Table1(DATETIME),从表1中选择cast(trim(从
TIMESTAMP
中拖尾的“Z”)作为DATETIME;但是INSERT会创建新行,而不会填充现有行。我的SQL技能太有限了。到目前为止,我可以用datetime类型的新列填充第二个表:插入到表2中(datetime、TOPIC、ID、有效载荷、单位、传感器、DerivedValue、DerivedValueDesc)选择cast(trim(trim)(从
时间戳中拖尾'Z')作为datetime)、主题、ID、有效载荷、单位、传感器、DerivedValue、表1中的DerivedValueDesc;这是伟大的,然后我可以保持旧表不变…是的,插入创建新行。您可能会考虑,但是如果插入/替换语句生成新的自动增量ID,那么这将无济于事,因为新插入物自然不会是重复的。是的,自动增量ID是正确的!所以我接受了你的回答。再次非常感谢你。
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)