带有daterange的WHERE子句中的SQL Server CASE

时间:2015-01-20 20:28:03

标签: sql-server sql-server-2008 ssrs-2008-r2

我有一个带有可选日期范围参数的查询,我正试图解决一个案例但是很难。

  • 如果两个日期都为NULL,则返回包括NULL日期行
  • 在内的所有内容
  • 如果两者都有值,则仅返回范围
  • 范围内的值
  • 如果from_date具有值,并且to_date为null,则返回所有内容> FROM_DATE
  • 如果from_date为null,并且to_date具有值,则返回所有内容< 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 ?

非常感谢帮助!!

1 个答案:

答案 0 :(得分:1)

看起来您已经确定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);