2016-11-11 15 views
0

列がcreatedDateおよびmodifiedDateの特定のテーブルからレコードを取得するのに最適なスクリプトは何ですか?modifiedDateは唯一のNULL可能な列で、現在の日付/現在の日付ですか?2つの日付列に基づいてレコードを選択

変更日の列のnullの値がある場合、スクリプトは作成された日付を取得します。

最新の作成または変更されたデータを含むすべてのレコードを出力する必要があります。

SELECT * 
FROM table 
WHERE ISNULL(CONVERT(date, ModifiedDate), 
      CONVERT(date,CreatedDate)) = CONVERT(date, getdate()) 

または

SELECT * 
FROM table 
WHERE CASE WHEN ModifiedDate IS NULL 
      THEN CONVERT(date, CreatedDate) 
      ELSE CONVERT(date,ModifiedDate) END = CONVERT(date, getdate()) 
+1

'convert(date、ModifiedDate)' ...これは、あなたの日付情報を非日付型で保存していることを意味しているので、これは好きではありません。 –

+0

同じ日付のレコードを取得する必要があります。私はConvert(日付、日付時刻)を使用して時刻を削除し、キャストしました(日付としてModifiedDate)、最も速い方法でレコードを取得する必要があります。 – jankenshin2004

+0

何が問題なのですかこれで何を試しましたか? –

答えて

1

あなたはちょうど今日に対してこれを必要とする場合(= GETDATE())これは、このように簡単でなければなりません:

SELECT * 
FROM tbl 
WHERE CAST(CreatedDate AS DATE) = CAST(GETDATE() AS DATE) 
    OR (ModifiedDate IS NOT NULL AND CAST(ModifiedDate AS DATE)= CAST(GETDATE() AS DATE)); 

いくつかの考え:(ここでは:ISNULL())機能を使用することは非常に悪いですでプレディケート。エンジンは既存のインデックスを適用できません。 sargableについて読む1つの例外は、CAST(SomeDateTime AS DATE)です。

これは今日(今日のみ)の日付には必要ありません。この行は今日作成されたものであるか、今日変更されています。

重要ModifiedDateCreatedDateのインデックスがあることを確認してください!

あなたが ISNULL(CONVERT(日付、ModifiedDate)、CONVERT(日付、CreatedDateに))= CONVERT(日付、GETDATE())表 FROM TSQL

SELECT * にISNULL()関数を使用することができ

+0

こんにちは@ Shnugo、ORは、私が思うようなパフォーマンスに影響を与えます。はい、それらの2つの列のインデックスがあります – jankenshin2004

+0

@ jankenshin2004なぜあなたはそう思いますか?簡単なブール論理(AND/OR ...)が可能な限り最速です。両方の列にインデックスがある場合、等しい数のチェックは、数百万の行であっても、高速であるはずです... – Shnugo

+0

私が今経験したデータに基づいて、ORを使用して上記のスクリプトを実行したとき、時間はあまりにも大きく異なっています。 – jankenshin2004

0

が、これはあなたが探しているものです:私は以下のこれらのスクリプトを試してみましたか?

SELECT 
    someColumn1, 
    someColumn2, 
    CASE 
     WHEN modifiedDate IS NULL THEN createdDate 
     ELSE modifiedDate 
    END AS someDate 
FROM someTable 
+0

については、すべてのレコードを取得するので、私はないと思う。上記のスクリプトにはフィルタがありません。もしこれを使用すると、何百万ものレコードが返されます。私は今日のレコードがほしいだけです – jankenshin2004

+0

サンプルデータを教えてください。 – dhaninugraha

0

+0

既存の答えを読んでください... 'WHERE'節での' ISNULL() 'の使用法は* sargable *ではありません。エンジンはインデックスを適用できません。これは避けなければならないものです... – Shnugo

+0

情報ありがとうございます。どのように試合COALESCE()機能?それはまた、インデックスの使用を壊すでしょうか? –

+0

はい、ほとんどの関数がオプティマイザをブラインドします。 'CAST(SomeDateTime AS DATE) 'のような例外はほとんどありませんが、ほとんどの場合、関数は*行単位の実行になります。 – Shnugo

0

関数を使用してインデックスに影響を与える場合は、これが効率的であれば、これを試してみてください。

SELECT * 
FROM table 
WHERE ModifiedDate IS NOT NULL 
AND CONVERT(date,ModifiedDate) = CONVERT(date, getdate() 
UNION 
SELECT * 
FROM table 
WHERE ModifiedDate IS NULL 
AND CONVERT(date,CreatedDate) = CONVERT(date, getdate() 
関連する問題