SQL查询日期null检查

时间:2010-07-05 11:21:59

标签: sql

我有以下存储过程。

ALTER PROCEDURE [dbo].[spList_Report] 
  @id INT, 
  @startDate DATETIME = NULL, 
  @endDate DATETIME = NULL, 
  @includeStatus1 BIT, 
  @includeStatus2 BIT, 
  @includeStatus3 BIT, 
  @includeStatus4 BIT 

AS 
  SET NOCOUNT ON 

  SELECT * 
  FROM 
    tblProducts as products 
  WHERE  
    product.intID = @id 
    AND product.dateMain >= @startDate  
    AND product.dateMain <= @endDate 

我知道这可能看起来像一个愚蠢的问题,但如果@startDate AND @endDate都为null,那么我希望它返回行忽略where子句中的日期检查。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:7)

这应该

AND product.dateMain >= ISNULL( @startDate, 0)
AND product.dateMain <= ISNULL( @endDate, product.dateMain + 1)
如果第一个值为null,则

ISNULL产生第二个值。

因此:

如果@startDate为空,则dateMain必须大于0(1900-01-01)

如果@endDate为空,则dateMain必须小于dateMain + 1 day

答案 1 :(得分:2)

你可以尝试这样的事情

ALTER PROCEDURE [dbo].[spList_Report] 
  @id INT, 
  @startDate DATETIME = NULL, 
  @endDate DATETIME = NULL, 
  @includeStatus1 BIT, 
  @includeStatus2 BIT, 
  @includeStatus3 BIT, 
  @includeStatus4 BIT 

AS 
  SET NOCOUNT ON 

  SELECT * 
  FROM 
    tblProducts as products 
  WHERE  
    product.intID = @id 
    AND product.dateMain >= ISNULL( @startDate, product.dateMain )  
    AND product.dateMain <= ISNULL( @endDate,  product.dateMain ) 

答案 2 :(得分:0)

您可以在Sql中使用“或”,但由于这是一个存储过程:

If @startdate is null Or @enddate is null
   begin
      select without using a date range
   end
Else
   begin
      select using date range
   end

答案 3 :(得分:0)

我会使用Kris Krause的解决方案,但更改“IF”语句以使用“AND”。我想如果你使用前两个解决方案,查询引擎可以在日期字段上执行表/索引扫描。您希望尽可能简洁地保持查询以获得最佳性能,因此不要对不必要的列运行查询。

IF @startdate IS NULL AND @enddate IS NULL
BEGIN
    SELECT * FROM tblProducts as products WHERE  
    product.intID = @id 
END
ELSE
BEGIN
    SELECT * FROM tblProducts as products WHERE  
    product.intID = @id 
    AND product.dateMain >= @startDate  
    AND product.dateMain <= @endDate 
END