SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラーと対処方法
SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラーと対処方法
企業向けのシステムでは、SQL Sever のバージョンをアップグレードしても、最初にリリースした時の SQL Server データベースの互換性レベル (compatibility level) で運用することもあると思います。
やがて、互換性レベルのサポートがなくなり、新しいバージョンの SQL Server データベースの互換性レベルにアップグレードせざるを得ない日がやってくると思います。
SQL Server 2008 R2 までは OK だったのに、SQL Server 2012 以降ではエラーになる構文のひとつに、DATETIME、DATE、TIME 型の値の add 演算があります。
例えば、日付 DATETIME 型と時間 TIME 型を + で足して、日時の DATETIME 型の値を取得している箇所があると、SQL Server 2012 以降では次のようなエラーになります。
Msg 402, Level 16, State 1, ... データ型 datetime と time は add 演算子では互換性がありません。
Msg 402, Level 16, State 1, ... The data types datetime and time are incompatible in the add operator.
- (subtract) 演算子も同様です。
エラーにならないようにするには、データ型を合わせてから足すように変更することで回避できます。
例えば、DATETIME 型の @InDate の値と TIME 型の @InTime の値を加えて、DATETIME を取得したい時は次のようにできます。
DECLARE @InDate DATETIME = '12/6/2023', @InTime TIME = '14:32'; SELECT @InDate AS InDate, CAST(@InTime AS DATETIME) AS InTime_DateTime, @InDate + CAST(@InTime AS DATETIME) AS Combined_InDateTime;
@InTime を DATETIME 型に変換して @InDate と足し合わすことで、@InDate と @InTime を合わせた日時が得られています。
TIME 型の値を DATETIME 型に変換すると日付けの部分が 1900-01-01 になりますが、add 演算子で足し合わせても年の部分が 2023 + 1900 となるわけではなく、時間のみが加算されます。
@InDate が DATE 型だった場合は、 @InDate も DATETIME に CAST してから時間を足し合わせます。
DECLARE @InDate DATE = '12/6/2023', @InTime TIME = '14:32'; SELECT CAST(@InDate AS DATETIME) AS InDate, CAST(@InTime AS DATETIME) AS InTime_DateTime, CAST(@InDate AS DATETIME) + CAST(@InTime AS DATETIME) AS Combined_InDateTime;
以上、SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラーと対処方法についてご紹介しました。