【发布时间】:2015-11-28 09:06:11
【问题描述】:
我有一个巨大的数据库,在某个表的某处,有一个 datetime 格式的字段被“0000-00-00 00:00:00”值损坏。
如何进行查询,以搜索给定的日期时间值 ex。 “0000-00-00 00:00:00”在整个数据库中的所有表和所有列和行中?
【问题讨论】:
我有一个巨大的数据库,在某个表的某处,有一个 datetime 格式的字段被“0000-00-00 00:00:00”值损坏。
如何进行查询,以搜索给定的日期时间值 ex。 “0000-00-00 00:00:00”在整个数据库中的所有表和所有列和行中?
【问题讨论】:
用plain mysql我觉得没办法。因此,这取决于您可用的编程语言。办公室。每种语言都支持 mysql 的本机命令,这将允许您编写执行所需搜索的脚本:
首先,您需要获取所有表:
SHOW TABLES
https://dev.mysql.com/doc/refman/5.0/en/show-tables.html
然后,在第一个循环中处理每个表,检索当前表的所有列:
SHOW COLUMNS FROM tableName WHERE TYPE = 'date' -- Maybe you use other types?
https://dev.mysql.com/doc/refman/5.0/en/show-columns.html
最后,您可以使用 outer 值 tableName 和 inner 值 columnName 来检索结果,您正在寻找:
SELECT * from tableName WHERE columnName = '0000-00-00 00:00:00';
所以,在脚本方面它可能看起来像这样(伪代码):
$tables = query("SHOW TABLES");
foreach($tables as $tableName){
$columns = query("SHOW COLUMNS FROM $tableName WHERE TYPE = 'date'");
foreach ($columns AS $columnName) {
$res = query("SELECT * from $tableName WHERE $columnName = '0000-00-00 00:00:00';");
foreach ($res AS $row){
echo "Table $tableName has a invalid date in column $columnName for row {$row["id"]}";
}
}
}
【讨论】:
你不能在一个简单的查询中做到这一点,但你可以创建一个为你构造一个复杂的查询;我回答了一个类似的问题here。
在您的情况下,您可能需要在 where 中使用 DATA_TYPE = 'datetime' 条件,而不是链接示例的 column_name 条件。
【讨论】:
IN ('datetime', 'timestamp')
你可以试试
SELECT TOP 1(*) FROM yourTable ORDER BY yourDateTimeColumn
前 1 行应该是您要查找的值的那一行
顺便说一句,我认为 SQL 日期不早于 1900 年
【讨论】: