2

私は最近、ある大きなテーブル (約 20 GB) から別のテーブルにデータをコピーするスクリプトを実行しましたが、そこでめちゃくちゃになり、datetime 列 ( と呼ばれるtimestamp) の列値が varchar データ型 ( と呼ばれるcategory_name) の別の列に保存されましたが、値は、ランダムな日時値 ( 、 、 など) に設定されているか、その範囲を持っていますtimestamp。コピーしたテーブルも新しいデータを取得し続けます。ただし、新しいデータは破損していません。適切なデータが始まる行の正確な ID を特定しようとしています。有効な値の列は、アルファベット値または. 次のクエリを試しました-NULL0000-00-00 00:00:000003-02-01 00:00:001990-12-00 00:00:00category_nameNULL

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日時文字列ではなく、列が有効なデータを取得し始めた場所から、ID/行のおおよその範囲を取得しようとしています。

4

3 に答える 3

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 に答える
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 に答える