2016-04-05 17 views
-4

これはなぜ私にDATETIMEの結果を与えるのですか?このコードの背後にあるトリックは何ですか?

Select DATEADD(yy,116, 0) 

出力:

2016-01-01 00:00:00.000 

この

Select DATEADD(yy,116 +1, -1) 

は私の年の最後の日を返しますか?

この背後にあるトリックは何ですか?私はちょうどそれで遊んでいたが、それが来る方法を取得しないでください?

+0

正確に分からない部分はありますか?あなたはそれについてもう少し詳細を教えていただけますか? –

答えて

4

はこの1つ上の死んだ馬をフロッギングが、ここで私の説明です読み取ることができます。

DATEADD(yy...は、指定された日付に年を追加しています。 (さて、省略形は悪いので、わかりやすくするためにDATEADD(YEAR,...)を使用してください)。

日付0は他の誰もが言ったように、1900年1月1日月曜日の深夜です。日付-1は1899年12月31日日曜日、1日前です。

あなたはあなたがまたSELECT DATEADD(YEAR,117, '1899-12-31')または日付リテラルを使用して、多数の他の方法としてこれを書くことができます12月31日、(+ 117 1899)= 2016 を取得-1日に116+1を追加した場合。なぜについては

ボーナス

Datetime2、日付パラメータとして渡すどんなタイプSmalldatetimeまたは他のタイプ、DATEADDリターンとは対照的に、それはDatetimeを返します。 -1は、(通常のキャスト/変換規則に従って)日時に暗黙的に変換されます。https://msdn.microsoft.com/en-AU/library/ms187928.aspxを参照してください。あなたが最後の日にしたい場合

SELECT 
    SQL_VARIANT_PROPERTY(GETDATE(), 'BaseType') BaseType, 
    SQL_VARIANT_PROPERTY(DATEADD(DAY, 1, GETDATE()), 'BaseType') DateAddBaseType, 
    SQL_VARIANT_PROPERTY(DATEADD(DAY, 1, CAST(GETDATE() AS DATETIME2)), 'BaseType') DateAddDatetime2, 
    SQL_VARIANT_PROPERTY(DATEADD(DAY, 1, CAST(GETDATE() AS SMALLDATETIME)), 'BaseType') DateAddSmallDatetime, 
    SQL_VARIANT_PROPERTY(DATEADD(DAY, 1, CONVERT(DATETIME2, GETDATE())), 'BaseType') DateAddDatetime2Convert 

エキストラボーナス

:あなたはこの動作を確認したい場合は

は、このコードはあなたに別の種類のDATEADDを供給した結果を表示します現在の年:

SELECT DATEADD(DAY, -1, DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE())+1,0)) 

それとも、現在の年の最後に解決DATETIME2をしたい場合(つまり、100nsのbefor e真夜中の新年):

SELECT DATEADD(NANOSECOND, -100,CAST(DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE())+1,0) AS DATETIME2(7))) 

これらをそれぞれ調べて、自分が行っていることをうまく処理できるようにします。

+0

あなたは死んだ馬を鞭打っているかもしれませんが、あなたの答えはまだ最も包括的です。私はそれがこの質問のために多すぎるかもしれないと思うが、とにかく私の投票を得た。 –

+0

@zoharありがとう!私は日付質問が大好きです:) –

5

0だからSelect DATEADD(yy,116 +1, -1)

SELECT CONVERT(datetime, 0) : Result is 1900-01-01 00:00:00.000 

1900-01-01から1日に短縮)だから、日-11899-12-31ある。すなわち、

1900-01-01である1899

に116 + 1(すなわち117)年に追加されます

117 years will add to 1899-12-31 00:00:00.000

+0

ありがとう、私にはあまり明確ではない – Stacky

+0

あなたは明確ではない部分ですか? – Squirrel

3

SQL Server日時は1900-01-01からの日数に基づいています。

0 = 1900-01-01 
-1 = 1899-12-31 

#116に116歳を追加し、#2に117歳を追加しました。

+0

返信ありがとうございますが私には明らかではありません – Stacky

0

SQL Serverはdatetime値を8バイトとして格納します。最初の4バイトは1900年1月1日からの日数を表し、最後の4バイトは真夜中以降のティック数を表します(ティックは3.3ミリ秒です。精度限界は3.3msである)。

datetime値に0を変換するときに、あなたは1900-01-01を取得します。
1の場合は1900-01-02,
となり、-1の場合は1899-12-31となります。

したがって、簡単な数学 - 116年を1900に加算すると2016になります。
117年を1899-12-31に加えると2016-12-31になります。

、SQL Serverのdatetime型のストレージの詳細については、あなたはthis article.

関連する問題