Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回重叠日期范围的日期范围_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 返回重叠日期范围的日期范围

Sql 返回重叠日期范围的日期范围,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个场景,其中我有一个SQL表,看起来像下面的屏幕截图。是否可以仅检索多个记录之间重叠部分的开始和结束日期?我回顾了StackOverflow中的类似问题,发现的是有重叠的记录,但不是实际的重叠范围 预期结果将显示开始日期为2017年1月1日,结束日期为2017年6月30日,因为该范围在两个记录中 让我们使用变量保持简单。我假设您正在使用表中两行的某种连接,其中ON条件确定日期重叠。但是,由于您要询问的部分是显示重叠日期,因此我们可以只使用变量: DECLARE @start1 date =

我有一个场景,其中我有一个SQL表,看起来像下面的屏幕截图。是否可以仅检索多个记录之间重叠部分的开始和结束日期?我回顾了StackOverflow中的类似问题,发现的是有重叠的记录,但不是实际的重叠范围

预期结果将显示开始日期为2017年1月1日,结束日期为2017年6月30日,因为该范围在两个记录中


让我们使用变量保持简单。我假设您正在使用表中两行的某种连接,其中ON条件确定日期重叠。但是,由于您要询问的部分是显示重叠日期,因此我们可以只使用变量:

DECLARE @start1 date = '20160701', @end1 date = '20170630'
       ,@start2 date = '20170101', @end2 date = '20171231'

SELECT CASE WHEN @start2 >= @start1 THEN @start2 ELSE @start1 END AS startdate
    ,  CASE WHEN @end2   <= @end1   THEN @end2   ELSE @end1   END AS enddate

关键是理解重叠上的逻辑

  • 如果我们正在搜索多行的重叠周期,那么它将始终从MAX(startDate)开始

  • 结束点将是大于开始日期的最小结束日期

  • 但我们需要考虑检查它们是否有重叠期

    因此,代码应该是:

    declare @start datetime = (select MAX(PlanYearStart) start from @t);
    
    if exists(select PlanYearEnd from @t where PlanYearEnd<@start)
    begin
        select null OverlapStart, null OverlapEnd;
        return;
    end;
    
    select 
        @start OverlapStart,
        MIN(PlanYearEnd) OverlapEnd
    from @t;
    
    declare@start datetime=(选择MAX(PlanYearStart)start from@t);
    
    如果存在(从@t where PlanYearEnd中选择PlanYearEnd您使用的是哪种DBMS?SQL Server?MySql?Oracle?表中是否只有两条记录?如果没有,您希望如何处理潜在的多次重叠?
    MAX
    year start和
    MIN
    year end?请阅读一些关于改进您的问题的提示。我们可以猜测数据类型吗是否可以添加DDL?您想要查询图片,还是我们同意使用文本进行DDL、数据和查询?根据问题指南,请不要发布代码、数据、错误消息等的图像。请在问题中复制或键入文本。请保留图像用于图表或演示渲染错误等这是不可能通过文本准确描述的。请展示您尝试过的内容,并告诉我们您(在本网站或其他地方)发现了什么,以及为什么它不能满足您的需要。您是在寻找单个重叠?还是多行重叠?您的示例数据可能太简单了。
    declare @start datetime = (select MAX(PlanYearStart) start from @t);
    
    if exists(select PlanYearEnd from @t where PlanYearEnd<@start)
    begin
        select null OverlapStart, null OverlapEnd;
        return;
    end;
    
    select 
        @start OverlapStart,
        MIN(PlanYearEnd) OverlapEnd
    from @t;