2011-10-24 15 views
0

こんにちは、私は4つの列id、name、start_date、end_dateのテーブルを持っています。日付句との比較のSQLクエリ

以下は、テーブルから行を取得しようとしたストアドプロシージャです。

Iの値(活性のための1、非アクティブ、およびヌル2)

Alter procedure dbo.GetName(@id int, @statusDate VARCHAR(50)) 
begin 
select id, name from customer 
where id = @id 
AND ((@statusDate = 1 AND GETDATE() BETWEEN start_date AND end_date) 
    OR (@statusDate = 2 AND GETDATE() BETWEEN start_date AND end_date) 
    OR @statusDate IS NULL) 
end 

@statusDateが1である場合、条件は

  • あるを有するであろうパラメータとして@statusを通過します開始日と終了日の間に今日ある行を取得する
  • @statusDateが2の場合は、開始日と終了日の間に日付がない行を取得する
  • @statusDateがnullの場合、すべての行

を取得し、それが上記の条件に基づいて行が

+0

:yyouパフォーマンスの問題が発生して起動した場合ので、(この構文は、Microsoft SQL Serverの場合)のように、あなたは、条件付きブロックを使用することをお勧めしますか?彼らに何が間違っていますか? – StevieG

+0

将来の日付としてstart_dateとend_dateを持つサンプル行を追加しました。 @statusDateを1として渡してクエリを実行すると、まだ行が取得されます。 – user982129

答えて

0

は、句のようなの先頭にヌルチェックを入れてみ取得するように、条件を変更して、私を助けてくださいこの:

select id, name from customer 
where id = @id 
AND ((@statusDate IS NULL) 
    OR (@statusDate = 1 AND GETDATE() BETWEEN start_date AND end_date) 
    OR (@statusDate = 2 AND NOT GETDATE() BETWEEN start_date AND end_date)) 

あなたの句はそれのために@statusDateがnullの場合は常にnullであるため、レコードが選択されていない

+0

上記のステートメントに変更すると同じ結果が表示されます – user982129

+0

@ statusDate = 2の場合、条件に気づいていません。私はそれに合わせてクエリを編集しました。もう一度やり直してください – mao

+0

こんにちはmao、end_dateまたはstart_dateが今日の日付であれば、このクエリは有効でしょうか? – user982129

1

どこかに質問はありますか?

データセットが小さい場合は、それをサポートするハードウェアによって異なりますが、上記のクエリはうまくいくように見えます(2番目の条件の論理エラーを除いて、下記を参照)。あなたは、クエリでどのような結果を得ている

ALTER PROCEDURE dbo.GetName 
    (
     @id INT 
    , @statusDate BIT 
    ) 
AS 
    BEGIN 

     IF @StatusDate IS NULL 
      BEGIN 
       SELECT id 
         , name 
       FROM customer 
       WHERE id = @id 
      END 


     IF @statusDate = 1 
      BEGIN 
       SELECT id 
         , name 
       FROM customer 
       WHERE id = @id 
         AND GETDATE() BETWEEN start_date AND end_date 

      END 


     IF @statusDate = 2 
      BEGIN 
       SELECT id 
         , name 
       FROM customer 
       WHERE id = @id 
         AND (GETDATE() < start_date 
           OR GETDATE() > end_date 
          ) 
      END 

    END 
+0

質問を編集しました。 'and'条件とクエリを変更して検索条件を満たすようにしてください – user982129

+0

@statusまたは@statusdateを過ぎていますか?投稿したサンプルを見ましたか?何かエラーメッセージが表示されました)、または検索条件を満たしていないのはなぜですか? –

+0

@statusDateを渡しています。実際には、条件の一つが上記の大きな検索基準を持っています。だから私はそれがあなたのコードがうまくいくはずですが、クラス – user982129

0
SELECT id, name 
    FROM customer 
    WHERE id = @id 
     AND @statusDate = 1 
     AND GETDATE() BETWEEN start_date AND end_date 

UNION ALL 

    SELECT id, name 
    FROM customer 
    WHERE id = @id 
     AND @statusDate = 2 
     AND GETDATE() NOT BETWEEN start_date AND end_date 

UNION ALL 

    SELECT id, name 
    FROM customer 
    WHERE id = @id 
     AND @statusDate IS NULL