6

MSDNでこれを参照しましたが、次の 2 つの例で DATEDIFF 関数の 2 番目の引数が何をしているのかまだわかりません。

SELECT DATEDIFF(yy,0,getdate()) -- 8 月 14 日に実行すると、112 が返されます。

SELECT DATEDIFF(yy,1000,getdate()) -- 1000 を任意に選択し、8 月 14 日に実行すると、110 が返されます。

通常DATEDIFF、2 か月間の日数または年数を求めるために使用し、2 番目の引数は日付です。

上記を理解したい理由は、最終的に次のことを理解するためです。

SELECT DATEADD(yy, DATEDIFF(yy,0,GETDATE()), 0)

4

3 に答える 3

9

2 番目の引数として整数を使用する場合 (またはその件に関する datetime/smalldatetime の割り当てに整数を使用する場合)、これは 1900-01-01 からの日数として解釈されます。

DECLARE @d1 DATETIME = 0, @d2 DATETIME = 1;
SELECT @d1, @d2;

結果:

1900-01-01 00:00:00.000    1900-01-02 00:00:00.000

DATEこれは、直接割り当て中のような新しいデータ型では機能しないことに注意してください。

DECLARE @d DATE = 0;

結果:

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

ただし、日付計算を使用しても機能します。たとえば、次のようになります。

DECLARE @d DATE = DATEADD(YEAR, 0, SYSDATETIME());
SELECT @d;

結果:

2012-08-14

これらの一貫性のない理由から、適切な日付リテラルを使用して、意味する日付が明確になり、データ型に関係なく機能することをお勧めします。0 を入力するのは19000101...

于 2012-08-14T15:18:44.183 に答える
1

datediff() の 2 番目の引数は日付です。

最初の例は、SQL Server ワールドの「開始」日付を返します。それは、現在の日付より 112 年前になります。

2 番目の例は、かなり無意味です。実装されているように、日付は最も早い日付からの日数で表されます。これは、最も早い日付から 1000 日後の年数です。

最後の例は、基準日に年数を追加します。次に、月数を追加します。基準日は 1900 年 1 月 1 日なので、これは y 年の n か月後の最初の日付になります。

于 2012-08-14T15:18:02.610 に答える