我的数据库中有一些日期格式为dd-mm-yy,有些日期为yy-mm-dd
我希望他们都在yy-mm-dd
它们存储在VARCHAR字段
中示例日期是:
2011-10-19和19-10-2011
是否有查询要运行以更新为任何不符合此格式的查询?
提前致谢!
答案 0 :(得分:3)
日期存储为日期,可能是您有字符串。
如果他们已经是实际日期,请根据需要使用DATE_FORMAT
。
如果它们是字符串,您最好的选择是将它们更改为实际日期,并将日期值存储在新列中。否则,在路上你会继续遇到很多问题,如Tony所说(+1 Tony!)。
然后,您可以使用STR_TO_DATE
填充它,例如
update tbl set new_date_field =
select STR_TO_DATE(string_date_field,'%y-%m-%d') ` # if string_date_field is '2011-01-01'
WHERE string_date_field RLIKE "^[0-9]{2}-";
获得真实日期后,您可以使用DATE_FORMAT(date_field, '%y-%m-%d')
如果你不能添加字段,唯一的另一个选择是进行字符串操作,即
Update table set date_field =
substr(string_date_field,7,2) + '-' + substr(string_date_field,3,2) + '-' + substr(string_date_field,0,2)
WHERE string_date_field RLIKE "^[0-9]{2}-";
即使这样,我仍然会推荐一个新的领域。
注意:如果您需要在更多步骤中执行此操作,请说您无法立即更改'date as string'字段的填充,您还可以添加post / post更新触发器(mySQL现在支持)继续进行转换(从字符串字段到实际日期字段)。
答案 1 :(得分:2)
你可以试试这样的东西(但先备份你的桌子!):
UPDATE table SET string_date_field = STR_TO_DATE(string_date_field, "%d-%m-%Y")
WHERE string_date_field RLIKE "^[0-9]{2}-";
RLIKE是REGEXP的同义词,您可以使用它来查找日期为有问题的%d-%m-%Y格式的记录。之后您可以更改表格,以便字段类型为DATE。此外,如果您的表有大量记录,也许您应该使用连续自动增量字段(当然存在一个当然!)来间隔执行此操作,以创建较小的记录集供服务器处理。例如:
UPDATE table SET string_date_field = STR_TO_DATE(string_date_field, "%d-%m-%Y")
WHERE ID >= 1000000 AND ID < 2000000 AND string_date_field RLIKE "^[0-9]{2}-";