首页 > 解决方案 > 如何返回开始日期和结束日期之间的记录

问题描述

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

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

标签: sqlsql-servertsqldatewhere-clause

解决方案


我将您的条件表述如下:

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

这实际上将检查日期范围是否重叠,这似乎是您正在寻找的。

DB Fiddle 上的演示

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

推荐阅读