当值为NULL时限制SQL搜索

时间:2015-06-11 21:57:35

标签: sql sql-server

我正在尝试向此SQL查询的WHERE子句添加另一个语句,以抛出一些我不需要的条目。

SELECT DATEPART(Year, CreateTimestamp) Year
, DATEPART(Month, CreateTimestamp) Month
, COUNT(*) Accepted

FROM Interactions t

WHERE t.QueueName = @queuName 
    AND (CAST(CreateTimestamp AS DATE) BETWEEN @firstMonth AND @lastMonth)
    AND TransferFrom != 'Yes'
GROUP BY DATEPART(Year, CreateTimestamp), DATEPART(Month, CreateTimestamp)

我需要添加过滤器DATEDIFF(SECOND, CreateTimestamp, AbandonTimestamp) > 10,但前提是AbandonTimestamp不是NULL。我知道有一个ISNULL()函数,但我基本上需要与此完全相反。任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:1)

当AbandonTimestamp为NULL时,您可以使用ISNULL并使用CreateTimestamp。这将导致DATEDIFF为假,因为经过的秒数将为0。

SELECT DATEPART(Year, CreateTimestamp) Year
, DATEPART(Month, CreateTimestamp) Month
, COUNT(*) Accepted
FROM Interactions t
WHERE t.QueueName = @queuName 
AND (CAST(CreateTimestamp AS DATE) BETWEEN @firstMonth AND @lastMonth)
AND TransferFrom != 'Yes'
AND DATEDIFF(SECOND, CreateTimestamp, ISNULL(AbandonTimestamp, CreateTimestamp)) > 10
GROUP BY DATEPART(Year, CreateTimestamp), DATEPART(Month, CreateTimestamp)

答案 1 :(得分:1)

如果AbandonTimestamp为空,则日期计算结果为空,因此在这种情况下只需使用COALESCE()来提供传递值:

WHERE COALESCE(DATEDIFF(SECOND, CreateTimestamp,
       AbandonTimestamp), 11) > 10

为了更详细地解释,COALESCE()函数返回其非空参数列表中的第一个术语。例如:

  • coalesce(1, 2, 3) - > 1
  • coalesce(null, 2, 3) - > 2
  • coalesce(null, null) - >空

在上面的表达式中,只有两个参数 - 两个查询 现在,如果第一个表中没有行,则max()的结果为null,因此coalesce将返回第二个查询的结果(如果其中没有行,也可以为null)。 / p>

请参阅整个表达式的live demo

答案 2 :(得分:0)

您可以使用案例陈述。请注意,如果为null,则此条件包含在内。

And 10 < Case When AbandonTimestamp Then 9 Else DATEDIFF(SECOND, CreateTimestamp, AbandonTimestamp) End

答案 3 :(得分:0)

这应该得到你想要的东西。如果AbandonTimestamp为NULL,它会添加一个检查,然后就可以了。如果它不为空,那么你需要CurrentTimestamp和AbandonTimestamp之间的datediff小于10。

WHERE t.QueueName = @queuName 
    AND (CAST(CreateTimestamp AS DATE) BETWEEN @firstMonth AND @lastMonth)
    AND TransferFrom != 'Yes'
    AND (
          (AbandonTimestamp IS NULL)
          OR (AbandonTimestamp IS NOT NULL AND DATEDIFF(SECOND, CreateTimestamp, AbandonTimestamp) > 10)
         )
GROUP BY DATEPART(Year, CreateTimestamp), DATEPART(Month, CreateTimestamp)

答案 4 :(得分:0)

SELECT DATEPART(Year, CreateTimestamp) Year
, DATEPART(Month, CreateTimestamp) Month
, COUNT(*) Accepted

FROM Interactions t

WHERE t.QueueName = @queuName 
    AND (CAST(CreateTimestamp AS DATE) BETWEEN @firstMonth AND @lastMonth)
    AND TransferFrom != 'Yes'
    AND (AbandonTimestamp IS NULL 
         OR AbandonTimestamp > DATEADD(second, 10, CreateTimestamp)) 
GROUP BY DATEPART(Year, CreateTimestamp), DATEPART(Month, CreateTimestamp)

答案 5 :(得分:0)

您可以附加此声明

(AbandonTimestamp不为null且DATEDIFF(SECOND,CreateTimestamp,AbandonTimestamp)&gt; 10)