2013-08-26 11 views
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データベースに上記のコードを実行すると、私はエラーを取得:

Msg 402, Level 16, State 1, Line 3 The data types datetime and time are incompatible in the add operator.

しかし、それは他のデータベースだとき、それは働きます! これはなぜ起こっている必要がありますか?

P.S. - エンタープライズ版では、これはデータベースのコンテキストに関係なくエラーをスローします。

+1

私はこの便利なリンクhttp://beyondrelational.com/modules/2/blogs/77/Posts/18855/0239-sql-server-2012-msg-402-the-data-types-datetimeを見つけましたtime-are-incompatible-the-addsubtract-op.aspx –

+0

[TSQLで時間フィールドを持つdatetimeフィールドを追加する]の重複が可能です(http://stackoverflow.com/questions/15228132/tsql-to- add-datetime-field-with-a-time-field) –

+0

有益なリンクのためにありがとう、アジェイ!なぜ2012年版のDeveloper Editionでまだ実行されている必要があるのか​​不思議です。半分焼いたロールアウト? :-) – tejaslakade

答えて

3

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

T-SQLデザイナーがこのようなサポートを追加していた場合、古いコード(サーバーとクライアントの両方)の大部分がエラーを検出するのが難しくなります。既定のタイムゾーン(ローカルまたはGMT)を前提として、ほとんどの人が古いdatetime型を使用していることを忘れないでください。

あなたが最初のタイムゾーン情報が含まれており、第二にはないのでのDateTimeOffset時間を追加することが、可能であるべきだと主張できますが、私は1つを変換する際にT-SQLの設計者は混乱を避けるために望んでいたと思いますもう一方のデータ型。多くのクライアントサイドコードは、クライアント側のタイプのタイムゾーン対応コードを変更しない限り、依然として破損します。

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

要するに、下位互換性は安全な方法で処理日+時刻を追加しません。

5

上記のコードは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) 
関連する問題