Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 带有日期范围的WHERE子句中的SQL Server大小写_Sql Server_Sql Server 2008_Ssrs 2008 R2 - Fatal编程技术网

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值或重新编译的最有效、最健壮的方法是对所有四种不同情况进行单独查询。但是您可能会更喜欢这种方法,尤其是在编译时很简单并且不经常执行的情况下。好的,谢谢,我现在就用它。看起来很有意思。我只需要检查一下性能。再次感谢!!非常感谢你的链接!