[英]Using Case in a Where Clause for Dates
我目前有这个WHERE
子句,其中包含以下参数。
WHERE
Project ID=110
AND ((CAST(saa.Date AS DATE) >= '09/24/2014' AND CAST(saa.Date AS DATE) <= '09/24/2014') OR saa.Date IS NULL))
这里最棘手的部分是saa.Date is NULL
部分将提取所有日期中的所有Null
值(这是多余的),我只想使用以下Date Range作为Null
值
(
(CAST(sa.StartDateTime AS DATE) >= '09/24/2014' AND CAST(sa.StartDateTime AS DATE) <= '09/24/2014')
OR
(CAST(sa.EndDateTime AS DATE) >= '09/24/2014' AND CAST(sa.EndDateTime AS DATE) <= '09/24/2014')
)
所以我试图弄清楚如何创建一个可以正常工作的CASE
语句,就像IF saa.Date为NULL然后[使用上面的日期范围参数]
我将以@AHiggins为答案,但会提高性能和可读性
-可贴性
-避免cast
WHERE
ProjectID=110 AND
(
(
saa.Date between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999'
) OR
(
saa.Date IS NULL AND
(
sa.StartDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999'
) OR
(
sa.EndDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999'
)
)
)
确保您在日期列上有索引
如果我没看错,您应该能够使用布尔逻辑和几百万个括号来做到这一点:
编辑:在@horaciux的答案的评论中注意到有一个问题,意识到我们实际上还需要几个括号。 我已经借回了代码,并在下面添加了其他功能。
WHERE
ProjectID=110 AND
(
(
saa.Date between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999'
) OR
(
saa.Date IS NULL AND
( -- need to wrap the next two conditions in a single set of parentheses
(
sa.StartDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999'
) OR
(
sa.EndDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999'
)
)
)
)
你知道
>= '09/24/2014'
AND <= '09/24/2014'
与= '09 / 24/2014'相同
where ProjectID=110
AND CAST(saa.Date AS DATE) = '09/24/2014'
OR (
saa.Date IS NULL
AND
(
CAST(sa.StartDateTime AS DATE) = '09/24/2014'
OR
CAST(sa.EndDateTime AS DATE) = '09/24/2014'
)
)
这比强制转换更有效:
DATEADD(dd, DATEDIFF(dd, 0, COL),0)
但是Horaciux的答案更加有效
尝试这个
(
(CAST(ISNULL(sa.StartDateTime, '09/24/2014') AS DATE) >= '09/24/2014' AND CAST(ISNULL(saa.StartDateTime, '09/24/2014') AS DATE) <= '09/24/2014')
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.