【问题标题】:SQL Server CASE in WHERE clause with daterange带有日期范围的 WHERE 子句中的 SQL Server CASE
【发布时间】:2015-01-20 20:28:03
【问题描述】:

我有一个带有可选日期范围参数的查询,我正在尝试解决一个案例,但遇到了困难。

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

我们将不胜感激!

【问题讨论】:

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


    【解决方案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);     
    

    【讨论】:

    • 我能问一下为什么 Option (RECOMPILE) 吗?
    • 谢谢,这似乎有效!这些日期很可能超出了范围,我只是真的不知道有任何其他方法可以做到这一点。如果有什么更有效的,我当然愿意接受建议
    • @Jay - 不需要使用标记值或重新编译的最有效和最可靠的方法是对所有四种不同情况进行单独查询。但是你可能更喜欢这个来维护性,特别是如果编译时间很短并且不经常执行。
    • 好的,谢谢,我现在就用这个​​。似乎可以解决问题。我只需要检查性能。再次感谢!!
    • 非常感谢您的链接!
    猜你喜欢
    • 2019-07-15
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多