SQL 実行エラーの解決策: 間違った時刻値が切り捨てられました

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 つずつバッチ更新して、このエラーを回避し、データを正常に更新します。

おすすめ

転載: blog.csdn.net/BHSZZY/article/details/133387130