【问题标题】:How to return records between a Start Date and End Date如何返回开始日期和结束日期之间的记录
【发布时间】:2020-01-05 09:18:07
【问题描述】:

我有以下查询返回开始日期或结束日期在指定日期范围之间的记录。

DECLARE @ReportStartDate date = '01 Apr 2019'
DECLARE @ReportEndDate date = '01 May 2019'

select * from #temp
where
            (StartDate between @ReportStartDate and @ReportEndDate) or 
            (EndDate between @ReportStartDate and @ReportEndDate) or 
            (EndDate is null)

我遇到的问题是开始日期是“2019 年 3 月 1 日”,结束日期是“2019 年 8 月 4 日”,这意味着它在 2019 年 4 月 1 日和 2019 年 5 月 1 日的日期范围内,但我的标准没有不满足。

我怎样才能包含这些类型的记录?

样本数据:

CREATE TABLE #temp
(
    ID int,
    StartDate datetime,
    EndDate datetime NULL
)

insert into #temp
(
    ID,
    StartDate,
    EndDate
)
select
    1,
    '01 Mar 2019',
    NULL
union all
select
    2,
    '01 Mar 2019',
    '04 Aug 2019'
union all
select
    3,
    '14 Jul 2019',
    NULL

【问题讨论】:

  • 那么你期待什么?我同意,20190301 和20190804 不在20190401 和20190501 之间,那么为什么要出现该行呢?
  • 如果您的startdate 和enddate 是20190405 和20190412..?
  • 旁白:overlap 的标签描述解释了适当的测试。

标签: sql sql-server tsql date where-clause


【解决方案1】:

我将您的条件表述如下:

(StartDate <= @ReportEndDate AND EndDate >= @ReportStartDate)
OR EndDate is null

这实际上会检查日期范围是否重叠,这似乎就是您要查找的内容。

Demo on DB Fiddle:

身份证 |开始日期 |结束日期 -: | :----------------- | :----------------- 1 | 2019 年 1 月 3 日 00:00:00 | 空 2 | 2019 年 1 月 3 日 00:00:00 | 2019 年 4 月 8 日 00:00:00 3 | 14/07/2019 00:00:00 | 空

【讨论】:

  • 赞成避免BETWEEN x AND y。独家上限 FTW!
  • BETWEEN 是一个方便且非常有用的功能。我认为你对它的种族主义是一种人身攻击。
猜你喜欢
  • 1970-01-01
  • 2016-05-15
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
相关资源
最近更新 更多