从列中获取非日期时间字符串值

时间:2012-12-10 10:41:23

标签: mysql regex string datetime

我最近运行了一个脚本,将数据从一个大表(大约20 GB)复制到另一个,我搞砸了,而日期时间列(称为timestamp)的列值被保存到另一个列中varchar数据类型(称为category_name),而timestamp值已设置为NULL或具有一系列随机日期时间值(如0000-00-00 00:00:000003-02-01 00:00:001990-12-00 00:00:00等)。我复制的表也不断获取新数据。但是新数据没有损坏。我正在尝试确定从我的好数据开始的行的确切ID。请注意,有效值category_name列可以是字母值,也可以是NULL。我尝试了以下查询 -

SELECT * FROM table_name 
WHERE `timestamp` IS NOT NULL 
AND `timestamp` != "0000-00-00 00:00:00"
ORDER BY id;

当我发现timestamp列中已保存所有类型的值时。

我接下来试过

SELECT * FROM table_name WHERE category_name REGEXP '[^a-zA-Z]' LIMIT 10;

哪个不起作用。

SELECT * FROM table_name WHERE category_name REGEXP '[:alpha:]' LIMIT 10;

也不起作用。

非常感谢任何帮助,谢谢。我只是想从我的category_name列开始获取有效数据而不是日期时间字符串的位置获取大约的ids /行范围。

3 个答案:

答案 0 :(得分:0)

您好,您可以将格式从时间戳更改为日期http://www.w3schools.com/sql/sql_dates.asp

http://forums.devshed.com/mysql-help-4/how-to-format-and-display-only-the-date-from-timestamp-1846.html

然后在那之后操纵你的数据。

您可能也希望在PHP中探索如何执行此操作。

答案 1 :(得分:0)

尝试使用STR_TO_DATE()功能。如果无法将字符串转换为日期,则返回NULL。并检查转换日期是否在您需要的范围内(在此示例中为去年(CURDATE()-365)

SELECT * FROM table_name 
WHERE `timestamp` IS NOT NULL 
AND LENGTH(`timestamp`)=19
AND IFNULL(STR_TO_DATE(`timestamp`,'%Y-%m-%d %h:%i:%s'),0)>CURDATE()-365 
ORDER BY id limit 1;

答案 2 :(得分:0)

我终于使用数据库备份解决了这个问题。我恢复了在运行脚本时所采用的数据库备份。使用它我能够得到我的数据被破坏的ID。然后我将干净的数据(从该id开始)移动到此恢复的表并切换表名。这需要一段时间,导致一些数据丢失。