これはなぜ私にDATETIMEの結果を与えるのですか?このコードの背後にあるトリックは何ですか?
Select DATEADD(yy,116, 0)
出力:
2016-01-01 00:00:00.000
この
Select DATEADD(yy,116 +1, -1)
は私の年の最後の日を返しますか?
この背後にあるトリックは何ですか?私はちょうどそれで遊んでいたが、それが来る方法を取得しないでください?
これはなぜ私にDATETIMEの結果を与えるのですか?このコードの背後にあるトリックは何ですか?
Select DATEADD(yy,116, 0)
出力:
2016-01-01 00:00:00.000
この
Select DATEADD(yy,116 +1, -1)
は私の年の最後の日を返しますか?
この背後にあるトリックは何ですか?私はちょうどそれで遊んでいたが、それが来る方法を取得しないでください?
はこの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)))
これらをそれぞれ調べて、自分が行っていることをうまく処理できるようにします。
あなたは死んだ馬を鞭打っているかもしれませんが、あなたの答えはまだ最も包括的です。私はそれがこの質問のために多すぎるかもしれないと思うが、とにかく私の投票を得た。 –
@zoharありがとう!私は日付質問が大好きです:) –
SQL Server日時は1900-01-01
からの日数に基づいています。
0 = 1900-01-01
-1 = 1899-12-31
#116に116歳を追加し、#2に117歳を追加しました。
返信ありがとうございますが私には明らかではありません – Stacky
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.
正確に分からない部分はありますか?あなたはそれについてもう少し詳細を教えていただけますか? –