我正在尝试向此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()
函数,但我基本上需要与此完全相反。任何帮助将不胜感激。
答案 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)