1

私は月の最後を取得しようとしています。そのために、次のように書いて、いいえを計算しました。今日から最後の日付までの日数。

    select datediff(DAY,GETDATE(),dateadd(m,1,getdate()))-GETDATE()

太字の部分は私にノーを与えます。今日と今日から 1 か月の間の日数、たとえば 30 または 31 とします。次に、30 または 31 から今日の日付を減算します。これは「 -getdate() 」です。

上記のクエリの出力は次のとおりです。

1786-06-06 11:44:30.540

クエリで何が起こっているのか説明していただけますか? 解決策を探しているわけではありません。SQL-Server がクエリをどのように解釈しているかを知りたいのです。

ありがとう。:)

4

2 に答える 2

10

式の太字部分は日付を返すのではなく、日数を返します。

31

それを日時に変換します。

SELECT CONVERT(DATETIME, 31);

これは、0 日目から 31 日( 1900-01-01) です。

1900-02-01

GETDATE()ここで、整数として減算します ( 415120 日目からの日数):

SELECT 31 - 41512 = -41481

ここで、-41481 日を 0 日目に追加します。

SELECT DATEADD(DAY, -41481, 0);
-- or
SELECT DATEADD(DAY, -41481, '19000101');

または:

SELECT CONVERT(DATETIME, 31 - CONVERT(INT, GETDATE()));

さて、私はいくつかのことを強くお勧めします:

  1. 暗黙の日付計算を使用しないでください。@date_var_or_col - 1たとえば、DATEや などの新しいデータ型では失敗しますDATETIME2
  2. のような省略表現は使用しないでくださいm。あなたが意味する場合はMONTH、大規模な生産性ヒットを取り、入力してMONTHください。理由を確認するには、これで期待どおりの結果が得られるかどうか教えてください。

    SELECT DATEPART(y, GETDATE()), DATEPART(w, GETDATE());
    
于 2013-08-27T16:25:41.853 に答える
2

「 -getdate() 」である 30 または 31 から今日の日付を減算しています。

何が起こっているのかを正確に理解しているように聞こえますが、結果を理解していない可能性があります。

GETDATE()からの日数 (および小数日) を表す数値に暗黙的に変換しています。1/1/1900 12:00:00 AM

GETDATE()から (2013 年 8 月 27 日時点で 41,511)を「引く」か、30または31-41,480、つまり 41,480 日前の回答を得た場合 1/1/1900これは約6/6/1786(小数部のプラスまたはマイナス数時間) になります。

于 2013-08-27T16:27:45.407 に答える