4

SELECT [Id]
      ,[DateOnline] --Nullable
      ,[DateOffline] --Nullable
      ,[PageId]
      ,[DownloadId]
      ,[Weight]
  FROM [DownloadPage]
  WHERE GETDATE() BETWEEN [DateOnline] AND [DateOffline]

に相当:

SELECT [Id]
      ,[DateOnline] --Nullable
      ,[DateOffline] --Nullable
      ,[PageId]
      ,[DownloadId]
      ,[Weight]
  FROM [DownloadPage]
  WHERE ([DateOnline] IS NULL OR [DateOnline] <= GETDATE())
  AND ([DateOffline] IS NULL OR [DateOffline] > GETDATE()) 

しかし、NULLにも対応していますか?

それとももっとエレガントな方法がありますか?

ここで括弧が必要な場所はどこですか?

ありがとう。

編集:

[DateOnline] と [DateOffline] の両方が DateTime 型です

[DateOnline] が NULL の場合、ロジックは「現在オンライン」です。

[DateOffline] が NULL の場合、ロジックは「オフラインにならない (オンラインになったら)」です。

申し訳ありませんが、最初からこれを質問に含める必要がありました。

4

2 に答える 2

5

作成者の 2 番目のクエリは、それらの列にインデックスがなくても、実質的にパフォーマンスが向上します。インデックスがある場合、それは簡単です... 合体を使用すると、インデックスが無効になり、インデックス シークの代わりにテーブル スキャンが実行されます (パフォーマンスに非常に悪い)。

それらの列にインデックスがなくても、「is null」は定数を返します...一方、合体関数の場合、NULL 値は毎回評価する必要があります。NULL の DateOnline と DateOffline でいっぱいのテーブルがある場合、このパフォーマンス リークは無視できません。

いずれにせよ、この場合に合体を使用する理由が思いつきません。

また、(日付範囲をチェックしているため) これらの 2 つの日付はすべてかゼロかであると推測しています。おそらく、これらの日付の 1 つだけを確認する必要があります。

 WHERE ([DateOnline] IS NULL)
 OR GETDATE() BETWEEN [DateOnline] AND [DateOffline]
于 2012-06-26T22:08:15.273 に答える
3

COALESCEnull を意味のある値に変換するために使用できます。この例では、常に有効な範囲内にあるデフォルト値を選択しました。

WHERE GETDATE() BETWEEN COALESCE([DateOnline] , '1900-01-01')
                    AND COALESCE([DateOffline], '2099-12-31')

デモ: http://www.sqlfiddle.com/#!3/def09/1

于 2012-06-26T21:28:25.893 に答える