11

サーバー: SQL Server 2012; SP1; 開発者版

コード:

declare @datetime datetime = '1900-01-01 00:00:00.000'

declare @time time = '11:11:11'

select @datetime + @time

MASTERデータベースで上記のコードを実行すると、次のエラーが発生します。

メッセージ 402、レベル 16、状態 1、行 3 データ型 datetime と time は、加算演算子で互換性がありません。

しかし、それが他のデータベースの場合は機能します! なぜこれが起こっているに違いないのですか?

PS - エンタープライズ エディションでは、データベース コンテキストに関係なく、これによりエラーがスローされます。

4

3 に答える 3

6

上記のコードは MS SqlServer 2008 で動作しますが、このコードは MS SqlServer 2012 以降では動作しません。私は同じ問題に遭遇し、このように解決しました。

DECLARE @today_start datetime
DECLARE @dail_time time   

SELECT @today_start = convert(datetime, @dayStr,103) + CAST(@dail_time as DATETIME)
于 2016-01-25T03:42:43.687 に答える
3

実際には、両方の値のタイムゾーンを知っていない限り、日付と時刻を追加するときに合理的な動作はありません。他のデータベースは、任意のデフォルトのタイムゾーンを想定している場合がありますが、SQL Server はそうではありません。

T-SQL の設計者がそのようなサポートを追加していた場合、古いコード (サーバー側とクライアント側の両方) の大部分は、検出が困難なエラーで機能しなくなります。ほとんどの人は、デフォルトのタイムゾーン (ローカルまたは GMT) を想定して、古い日時型を使用していることに注意してください。

最初のデータにはタイムゾーン情報が含まれ、2 番目のデータには含まれていないため、 datetimeoffset時刻を追加できるはずだと主張することもできますが、T-SQL 設計者は、あるデータ型を別のデータ型に変換する際の混乱を避けたかったと思います。多くのクライアント側のコードは、クライアント側のタイプのタイムゾーン対応コードを変更しない限り、依然として機能しません。

では、加算を行う明示的な関数がないのはなぜでしょうか。タイムゾーンのない日時型は暗黙的にdatetimeoffset2に変換されるため、おそらくどちらも機能しません。タイムゾーンのない値をそのような関数に簡単に渡すことができ、関数に渡される前に間違ったタイムゾーンに変換されます

つまり、下位互換性は、日付と時刻の加算を安全に処理する方法を提供しません。

于 2013-08-26T10:09:04.070 に答える