【问题标题】:Between Date Time T-SQL日期时间T-SQL之间
【发布时间】:2015-10-21 22:13:43
【问题描述】:

我有以下 Where 子句导致我出现问题,我正在寻找解决方法。

@startDate 是今天的日期,@endDate 是结束日期,可以是未来 7 天、14 天或 20 天,除非结束月份大于开始月份。

问题 - 如果 StartDate DAY 是 20 并且 END Date Day 在下个月示例 Start Day 是 10/21 并且 End Day 是 11/5 比 where 子句取消它自己,我不能使用之间是因为我们不包括年份。 我尝试了 OR,但这也不起作用。

 WHERE    DAY(t.AnniversaryDate) >= DAY(@startDate) 
            AND DAY(t.AnniversaryDate) <= DAY(@endDate)
            AND MONTH(t.AnniversaryDate) >= MONTH(@startDate)
            AND MONTH(t.AnniversaryDate) <= MONTH(@endDate)
            AND YEAR(t.AnniversaryDate) < YEAR(GETDATE())

【问题讨论】:

  • 描述你想要达到的目标。现在看起来像 The XY Problem
  • 我希望能够在不包括年份的两个日期之间进行搜索。
  • 共享样本数据 + 所需输出。
  • 只要未来的日期与月份相同,只有当结束日期的月份发生变化时,SQL 才能完美运行

标签: tsql


【解决方案1】:

表达式

select DATEADD(year,DATEDIFF(year,'19780517',GETDATE()),'19780517')

将始终返回当年的 5 月 17 日。通过将'19780517' 的两个实例替换为感兴趣的日期,可以使用类似的表达式对任何日期1 执行相同的技巧。

所以,无论“我不能使用 Between,因为我们不包括年份”是什么意思,您都应该能够通过使用上述表达式来解决它。

所以,我认为你想要的是:

WHERE    DATEADD(year,
         DATEDIFF(year,t.AnniversaryDate,GETDATE()),
                       t.AnniversaryDate)
         BETWEEN @startDate and @endDate

1只要您对 2 月 29 日映射到 2 月 28 日感到高兴,如果您在非闰年提出要求。

【讨论】:

  • 这将返回一个日期列表,例如我想做的是搜索具有 YR 的 Anniversarydate 以及没有 YR 的 StartDate 和 EndDate 之间的日期。
  • 我可以建议您更改逻辑以仅将函数应用于变量侧,而不是列,因为该列中的任何索引都会为了查询性能而受到阻碍
  • @Jean - 是的,如果你需要索引,你必须在这里寻找一个变体。您无法避免需要对列进行计算(如果您考虑查询的性质),但您要做的是创建一个计算列,将所有日期标准化为一年(例如,1978 或 2001)通过更改表达式的 GETDATE() 部分,然后索引 that 列。完成后,您可以使用索引对其进行查询,但您必须将开始和结束日期值标准化为同一年。
  • 我的错。是的,你需要去掉变量和无用的年份部分,因为它只会造成不匹配。
  • 我发现这不适用于新年的日期 12-20- 1-5?
猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多