GETUTCDATE()-2とDATEADD(d、-2、GETUTCDATE())


13

次の2つの方法の違いは何ですか?

 GETUTCDATE()-2  

そして

  DATEADD(d,-2,GETUTCDATE())

使用DATEADDは正しい方法だと思いますが、なぜだろうと思っていましたか?

回答:


14

そこには実際の違いはありませんが、DATETIME2値、またはDATETIME2値を返す関数の使用を開始すると、エラーが発生します。

SELECT SYSDATETIME() - 1 AS [Incompatible]

メッセージ206、レベル16、状態2、行17オペランドタイプの衝突:datetime2はintと互換性がありません

これらについては、日付の数学関数を使用する必要があります。

SELECT DATEADD(DAY, -1, SYSDATETIME()) AS [Compatible]

アーロン・バートランドはこの問題について彼のバッド・ハビッツ・トゥ・キック・シリーズで簡単に述べています。


8

他の回答の1つにある主張とは異なり、どちらのオプションもSQL Serverによって正式にサポートおよび文書化されています。datetime - numberこれは未定義の動作ではありません

の大きな利点

DATEADD(d, -2, GETUTCDATE())

それは自己文書化されているという事実です:その目的はすぐに明らかです。

GETUTCDATE() - 2一方、datetime - number操作の定義を知っている読者に依存しています。はい、現在は慣用的なT-SQLである可能性がありますが、これがサポートされなくなったという事実はdatetime2、将来の世代のSQL Server開発者がこれに慣れていない可能性があることを意味します。


それは、より多くのここで明示的に述べています:算術演算子(のTransact-SQL)のプラス(+)とマイナス( - )演算子はまた、上の算術演算を実行するために使用することができdatetime型smalldatetime型の値。
ypercubeᵀᴹ

@ypercubeᵀᴹ:-(減算)(Transact-SQL)の最初の行は、単位(日)に対してさらに明示的です:"2つの数値を減算します(算術減算演算子)。日付から日数を減算することもできます "
ハインツィ

はい、見ました。その後、「date、time、datetime2、またはdatetimeoffsetデータ型では使用できません。」したがって、最初の文の「日付」は、禁止されているものを除くすべての日付/時刻型を意味します(したがって、datetimeおよびsmalldatetimeのみ、基本的に、date追加された2008(?)バージョンより前に存在した日付時刻型)。それは少し厄介です。
ypercubeᵀᴹ

多分それはあなたの答えに加えることができるもう一つのものです。この演算子が新しい型をサポートしていないという事実は、下位互換性の理由でのみ保持されていることを示唆しています。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.