无法在MySql中将varchar转换为datetime

时间:2014-09-20 11:33:27

标签: mysql sql datetime datetime-format

在我的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

3 个答案:

答案 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

Demo of the UPDATE

如果新列应该具有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;

Updated Demo

答案 1 :(得分:1)

如果您的varchar数据的格式如此,那么,2014-09-20 19:45'更改列的数据类型将起作用。为什么?这是DATETIME和其他面向时间的数据类型使用的字符表示。

但它不是。那么,你有什么选择? 一个是使用这四个步骤:

  1. 更改表格以添加具有临时名称的新DATETIME
  2. 执行UPDATE没有WHERE子句来填写该列的值
  3. 更改表格以删除上一栏
  4. 更改表以将新列重命名为与刚刚删除的列相同的名称。
  5. 这是怎么回事。

    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格式,因此无法更改

您可以删除其中的数据,然后尝试更改