2

我最近运行了一个脚本,将数据从一个大表(大约 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/rows 范围。

4

3 回答 3

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 中执行此操作。

于 2012-12-10T10:54:01.873 回答
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;
于 2012-12-10T12:08:01.000 回答
0

我终于使用数据库的备份解决了这个问题。我恢复了在我运行脚本时拍摄的数据库备份。使用它,我能够获得我的数据损坏的 ID。然后我将我的干净数据(从那个 id 开始)移动到这个恢复的表并切换表名。虽然花了一段时间,但导致一些数据丢失。

于 2012-12-13T07:14:02.287 回答