sql >> データベース >  >> RDS >> Sqlserver

SQL サーバーの日時フィールドを変換して、日付部分のみを比較し、インデックス付きルックアップを使用する

    日時フィールドの時間部分を削除する最善の方法は、datediff および dateadd 関数を使用することです。

       DateAdd(day, datediff(day,0, MydateValue), 0)
    

    これは、SQL Server が日付を 2 つの整数として格納するという事実を利用しています。1 つは日 "0" - (1900 年 1 月 1 日) からの日数を表し、2 番目は ティック<の数を表します。 /em> (各ティックは約 3.33 ミリ秒) 真夜中 (時間) から *.

    上記の式は、最初の整数のみを読み取る必要があります。変換や処理が必要ないため、非常に高速です。

    クエリにインデックスを使用させるには...最初に入力フィルタリング パラメーターで、またはテーブルの日時フィールドの等号の「反対側」でこの式を使用して、クエリ オプティマイザーが計算を実行する必要がないようにします。テーブル内のすべての日時フィールドで、どの行がフィルター述語を満たすかを判断します。これにより、検索引数が「SARG 対応」 (検索 ARGument) になります。

    Where MyDateTimeColumn > DateAdd(day, 
          datediff(day,0, @MydateParameter), 0)    -- SARG-able
    

    ではなく

    Where DateAdd(day, datediff(day,0, 
          MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
    

    * ノート。内部的には、2 番目の整数 (時間部分) にティックが格納されます。 1 日には 24 x 60 X 60 X 300 =25,920,000 ティックがあります (偶然にも 32 ビット整数が保持できる最大値のすぐ下です)。ただし、datetime を算術的に変更する場合は、これについて心配する必要はありません... datetime から値を加算または減算する場合、値を 1 日の小数部分とまったく同じであるかのように、小数として扱うことができます。完全な日時値は、日付を表す整数部分と時刻を表す小数部分で構成される浮動小数点数でした)。つまり、

    `Declare @Dt DateTime  Set @Dt = getdate()  
     Set @Dt = @Dt + 1.0/24  -- Adds one hour  
     Select @Dt  
     Set @Dt = @Dt - .25 -- Moves back 6 hours  
     Select @Dt`
    


    1. SQLServerで日時をM/D / YYYYとしてフォーマットするにはどうすればよいですか?

    2. PHP、MySQL:この未定義のインデックスエラーを説明できません

    3. SQLクエリからテーブルを作成する方法

    4. postgresでデータベースを切り替える方法は?