【问题标题】:Return data where any part of StartDate and EndDate fall within filter date range返回 StartDate 和 EndDate 的任何部分在筛选日期范围内的数据
【发布时间】:2017-08-23 15:24:37
【问题描述】:

我有一堆带有 StartDate 和 EndDate 的产品记录。我还有一个 StartDate 和 EndDate 过滤器设置作为参数传入。

目标:
返回产品日期范围的任何部分介于或等于过滤器设置日期范围的任何产品。

这是我的尝试,但它不起作用:

((@FilterStartDate <= prod.StartDate AND @FilterStartDate <= prod.EndDate)
OR
(@FilterEndDate >= prod.StartDate AND @FilterEndDate <= prod.EndDate))

【问题讨论】:

标签: sql sql-server


【解决方案1】:

也许这就是您希望这个简化版本仅检查开始或结束是否在范围内的内容...

where
    (prod.StartDate >= @FilterStartDate and prod.StartDate <= @FilterEndDate)
    or 
    (prod.EndDate  >= @FilterStartDate and prod.EndDate <= @FilterEndDate) 

【讨论】:

  • 一个问题。假设过滤器 StartDate 是 1/1/2015,过滤器 EndDate 是 12/31/2015。 StartDate: 1/1/2016 和 EndDate 6/31/2016 的产品仍将显示。当我不希望显示此产品记录时,范围内的开始将验证为真。
  • 不,不会@BlakeRivell。看简化版。 prod.StartDate &lt;= @FilterEndDate 因此不会显示。强制执行此操作的是带括号的布尔 AND。
  • 我看到简化版很好。其他版本不工作。
  • @BlakeRivell 很高兴简化版的工作,然后兄弟
  • “简化”的版本还是过于复杂,逻辑更简化了。
【解决方案2】:

您要检查筛选器开始日期是否早于产品结束日期,以及筛选器结束日期是否晚于项目开始日期,例如:

@FilterStartDate <= prod.EndDate 
AND @FilterEndDate >= prod.StartDate

【讨论】:

  • 这行不通。假设过滤日期是 2015 年 1 月 1 日到 2015 年 12 月 31 日。产品日期为 2016 年 1 月 1 日至 2016 年 12 月 31 日。你的表达式会在不应该的时候作为 true 传递。
  • 是的,因为@FilterEndDate &gt;= prod.StartDate 子句的第二部分,它会起作用。请注意,它与第一个与AND 结合使用。
  • 别担心,日期逻辑有时会令人困惑:)
【解决方案3】:

假设您的日期列实际上是日期时间,您可以尝试

WHERE prod.StartDate >= 'yourStartDate' AND prod.EndDate

或者,如果不是日期时间并且您更喜欢强制转换:

WHERE CAST(dates as date) BETWEEN 'yourStartDate' 和 'yourEndDate'。

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多