I.はじめに
運用データベースが最近変更されたため、データのバッチを更新する必要があります。
1. まず、次の SQL を実行します。
select count(*) from class_subject
where endtime is not null and starttime is not null and round(TIME_TO_SEC(TIMEDIFF(endtime,starttime))/60/60,1)!=round(hour,1)
クエリ対象のデータですので结束时间-开始时间!=hour
、この実行では問題ありません。
2. 次に、この SQL を実行すると、エラーが報告されます。
update class_subject set hour=round(TIME_TO_SEC(TIMEDIFF(endtime,starttime))/60/60,1)
where endtime is not null and starttime is not null and round(TIME_TO_SEC(TIMEDIFF(endtime,starttime))/60/60,1)!=round(hour,1)
設定したいだけですhour=结束时间-开始时间
が、エラーが発生します。
SQL错误[1292][22001]:Data truncation:Truncated incorrect time value:
'2616:30:00'
2. 調査の流れ
百度によれば、次のように言う人もいた。
1. 根本的な理由は、この関数は 2 つの日付の時差を計算しますが、その最大値は 838:59:59 (35 日未満) までしかなく、それを超えるとエラーが報告されるためです。
しかし、データベースのデータを確認したところ、round(TIME_TO_SEC(TIMEDIFF(endtime,starttime))/60/60,1)
その差は最大でも 3 時間にすぎず、35 日を超えていないことがわかりました。
3. 解決策
まず、データベース内のデータを一括更新することが目的ですが、select を実行しても問題がないことがわかったので、すべてのデータの更新対象の ID と値をクエリすることにしました。バッチで 1 つずつ更新します。
1. SQL の使用:
select id, round(TIME_TO_SEC(TIMEDIFF(endtime,starttime))/60/60,1)!=round(hour,1) as hour from class_subject
where endtime is not null and starttime is not null and round(TIME_TO_SEC(TIMEDIFF(endtime,starttime))/60/60,1)!=round(hour,1)
このようにして、変更するデータの ID と変更が必要な目標時間値をクエリできます。
2. Excel を使用して、データを次の形式にバッチ結合します。
update class_subject set hour='xxx' where id='xxx';
update class_subject set hour='xxx' where id='xxx';
update class_subject set hour='xxx' where id='xxx';
3. 次に、1 つずつバッチ更新して、このエラーを回避し、データを正常に更新します。