在我的MySql表中,有一个名为_time的varchar类型的列。它保存的值采用以下格式:year month day hour minute
没有空格:201409201945
我想将其转换为datetime
,所以我这样做:
ALTER TABLE `my_table` CHANGE COLUMN `_time` `date_time` DATETIME NOT NULL;
由于某种原因,它会抛出此错误:
Error Code: 1292. Incorrect datetime value: '201409201945' for column '_date_time' at row 1 0.036 sec
答案 0 :(得分:6)
@Arkain提到的三个步骤将在函数STR_TO_DATE
的帮助下完成-- add the new column
ALTER TABLE `my_table` ADD COLUMN `date_time` DATETIME;
-- update the new column with the help of the function STR_TO_DATE
UPDATE `my_table` SET `date_time` = STR_TO_DATE(`_time`, '%Y%m%d%H%i');
-- drop the old column
ALTER TABLE `my_table` DROP COLUMN `_time`;
STR_TO_DATE的完整说明符列表可以在DATE_FORMAT找到,这里摘录了我使用的那些:
%d Day of the month, numeric (00..31)
%H Hour (00..23)
%i Minutes, numeric (00..59)
%m Month, numeric (00..12)
%Y Year, numeric, four digits
如果新列应该具有NOT NOLL属性,一种方法是在操作之前将sql模式设置为''并稍后重置sql_mode:
SET @old_mode = @@sql_mode;
SET @@sql_mode = ''; -- permits zero values in DATETIME columns
ALTER TABLE `my_table` ADD COLUMN `date_time` DATETIME NOT NULL;
UPDATE `my_table` SET `date_time` = STR_TO_DATE(`_time`, '%Y%m%d%H%i');
ALTER TABLE `my_table` DROP COLUMN `_time`;
SET @@sql_mode = @old_mode;
答案 1 :(得分:1)
如果您的varchar
数据的格式如此,那么,2014-09-20 19:45'更改列的数据类型将起作用。为什么?这是DATETIME
和其他面向时间的数据类型使用的字符表示。
但它不是。那么,你有什么选择? 一个是使用这四个步骤:
DATETIME
列UPDATE
没有WHERE
子句来填写该列的值这是怎么回事。
ALTER TABLE my_table ADD COLUMN tempstamp DATETIME
UPDATE my_table SET tempstamp = STR_TO_DATE(_time, '%Y%m%d%H%i')
ALTER TABLE my_table DROP COLUMN _time
ALTER TABLE my_table CHANGE tempstamp _time DATETIME NOT NULL
另一种方法:将_time
中的字符串更改为有效的日期时间值,然后更改列。如果您的varchars()
宽度足以容纳一些额外字符,请尝试此操作。
UPDATE my_table SET `_time`=STR_TO_DATE(`_time`, '%Y%m%d%H%i')
ALTER TABLE my_table CHANGE `_time` `_time` DATETIME NOT NULL
这可行,因为STR_TO_DATE()
会为您的字符串生成DATETIME
个值,然后MySQL会将它们转换回字符串以存储回varchar
列。然后,您可以将数据类型更改为DATETIME
。
你可能已经注意到我投入了NOT NULL
。如果您要在该列上添加索引,NOT NULL
是一件好事。但是,如果你的某些时间价值缺失,它就不会起作用。
答案 2 :(得分:0)
由于数据库不知道如何处理201409201945,因此它不是有效的DateTime格式,因此无法更改
您可以删除其中的数据,然后尝试更改