2011-10-24 111 views
0

嗨我有一个表,四列id,名称,start_date,end_date。SQL查询与日期比较在哪里条款

下面是我尝试从表中检索行的存储过程。

我将被传递@status作为将具有值的参数(有效,2为无活性的1和null)

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然后检索具有开始日期和结束日期之间的今天日期的行
  • 如果@statusDate是2,则检索在开始日期和结束日期之间没有今天日期的行
  • 如果@statusDate为null,则检索所有的行

请帮我修改和条件,使其检索基于上述条件

+0

什么结果你跟你的查询得到些什么?他们怎么了? – StevieG

+0

我添加了具有start_date和end_date作为未来日期的示例行。如果我通过将@statusDate作为1来执行查询,我仍然可以获取行。 – user982129

回答

0

试试行把空检查在where子句一样开始这样的:

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为空,所以没有记录被选中是因为它

+0

如果我更改为上述说明,我将得到相同的结果 – user982129

+0

如果@ statusDate = 2,我还没有注意到条件。我编辑了查询以匹配它。再试一次 – mao

+0

喂毛,如果end_date或start_date是今天的日期,那么它应该处于活动状态,这个查询会为我工作吗? – user982129

1

有一个问题在那里的某个地方?如果你的数据集很小(而且很小取决于支持它的硬件),那么你的上面的查询看起来很好(除了第二个条件中的逻辑错误,请参见下文)。如果yyou开始遇到性能问题,您可能需要使用条件块,像这样(这句法是针对Microsoft SQL Server):

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

重新编辑问题..请帮助我修改'和'条件和查询,以便它符合我的搜索条件 – user982129

+0

您的传球@status或@statusdate?你看过我发布的样品吗?什么是你得到的错误信息9if),或者它为什么不满足搜索条件? –

+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