Sql server 带有日期范围的WHERE子句中的SQL Server大小写
我有一个带有可选日期范围参数的查询,我正试图用一个案例来解决这个问题,但遇到了困难Sql server 带有日期范围的WHERE子句中的SQL Server大小写,sql-server,sql-server-2008,ssrs-2008-r2,Sql Server,Sql Server 2008,Ssrs 2008 R2,我有一个带有可选日期范围参数的查询,我正试图用一个案例来解决这个问题,但遇到了困难 如果两个日期都为空,则返回所有内容,包括空日期行 如果两者都有值,则仅返回范围内的值 如果from_date有值,而to_date为空,则返回一切>from_date 如果from_date为null,而to_date有值,则返回所有
- 如果两个日期都为空,则返回所有内容,包括空日期行
- 如果两者都有值,则仅返回范围内的值
- 如果from_date有值,而to_date为空,则返回一切>from_date
- 如果from_date为null,而to_date有值,则返回所有
SELECT *
FROM TABLE
WHERE CASE WHEN (@FROM_DATE IS NOT NULL and @TO_DATE IS NOT NULL) THEN
DATE BETWEEN ISNULL(@FROM_DATE,1/1/1900) and ISNULL(@TO_DATE,1/1/2999)
ELSE
DATE = DATE ?
非常感谢您的帮助 看起来您已经决定1900年和2999年的日期不会合法地出现在数据中,因此您可以使用
SELECT *
FROM TABLE
WHERE (@FROM_DATE IS NULL AND @TO_DATE IS NULL )
OR (DATE BETWEEN ISNULL(@FROM_DATE, '19000101')
AND ISNULL(@TO_DATE, '29990101'))
OPTION (RECOMPILE);
我可以问一下为什么选择(重新编译)吗?谢谢,这似乎有效!这些日期很可能超出范围,我只是不知道还有什么其他的方法。如果有更有效的方法,我当然愿意接受suggestions@Jay-不需要使用sentinel值或重新编译的最有效、最健壮的方法是对所有四种不同情况进行单独查询。但是您可能会更喜欢这种方法,尤其是在编译时很简单并且不经常执行的情况下。好的,谢谢,我现在就用它。看起来很有意思。我只需要检查一下性能。再次感谢!!非常感谢你的链接!