Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.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 查找至少90天内处于活动状态的所有合同_Sql_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql 查找至少90天内处于活动状态的所有合同

Sql 查找至少90天内处于活动状态的所有合同,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我需要找到所有CID(合同)都满足以下条件 它们在2011年1月1日至2011年6月30日期间处于活动状态(可以在截止开始日期之前或之后开始,也可以在截止结束日期之前或之后结束),但它们必须在这些日期之间处于活动状态 它们在2011年1月1日至2011年6月30日期间至少活跃90天 我能想到的唯一解决方案是unpivot,这样在日期范围内的每一天都有一个1,在该范围外的每一天都有一个0。然后我们可以总结1,如果它大于2011年前六个月的天数,则包括该合同 有更好的办法吗 下面是如何生成数据

我需要找到所有CID(合同)都满足以下条件

  • 它们在2011年1月1日至2011年6月30日期间处于活动状态(可以在截止开始日期之前或之后开始,也可以在截止结束日期之前或之后结束),但它们必须在这些日期之间处于活动状态
  • 它们在2011年1月1日至2011年6月30日期间至少活跃90天
  • 我能想到的唯一解决方案是
    unpivot
    ,这样在日期范围内的每一天都有一个1,在该范围外的每一天都有一个0。然后我们可以总结1,如果它大于2011年前六个月的天数,则包括该合同

    有更好的办法吗

    下面是如何生成数据

          Select CID = 5439, ContractStartTime = '2008-06-26 00:00:00.000', ContractStopTime  = '2012-01-29 00:00:00.000'
    UNION Select CID = 6216, ContractStartTime = '2008-07-02 00:00:00.000', ContractStopTime  = '2010-12-02 00:00:00.000'
    UNION Select CID = 7770, ContractStartTime = '2008-12-03 00:00:00.000', ContractStopTime  = '2010-12-01 00:00:00.000'
    UNION Select CID = 12432, ContractStartTime = '2009-12-17 00:00:00.000', ContractStopTime  = '2010-12-15 00:00:00.000'
    UNION Select CID = 13986, ContractStartTime = '2009-05-11 00:00:00.000', ContractStopTime  = '2011-05-09 00:00:00.000'
    UNION Select CID = 14763, ContractStartTime = '2009-12-28 09:00:00.000', ContractStopTime  = '2012-03-25 00:00:00.000'
    UNION Select CID = 16317, ContractStartTime = '2010-12-08 00:00:00.000', ContractStopTime  = '2011-12-06 00:00:00.000'
    UNION Select CID = 20979, ContractStartTime = '2010-10-14 00:00:00.000', ContractStopTime  = '2012-12-12 00:00:00.000'
    UNION Select CID = 17871, ContractStartTime = '2010-01-20 00:00:00.000', ContractStopTime  = '2012-01-19 00:00:00.000'
    UNION Select CID = 19425, ContractStartTime = '2010-02-23 00:00:00.000', ContractStopTime  = '2012-02-21 00:00:00.000'
    UNION Select CID = 21756, ContractStartTime = '2010-12-28 00:00:00.000', ContractStopTime  = '2012-12-25 00:00:00.000'
    UNION Select CID = 20202, ContractStartTime = '2011-02-24 00:00:00.000', ContractStopTime  = '2012-05-02 00:00:00.000'
    UNION Select CID = 22533, ContractStartTime = '2010-12-27 00:00:00.000', ContractStopTime  = '2011-01-26 00:00:00.000'
    UNION Select CID = 23310, ContractStartTime = '2010-06-21 00:00:00.000', ContractStopTime  = '2011-06-21 00:00:00.000'
    UNION Select CID = 24864, ContractStartTime = '2010-07-25 00:00:00.000', ContractStopTime  = '2012-12-26 00:00:00.000'
    UNION Select CID = 27195, ContractStartTime = '2011-01-11 00:00:00.000', ContractStopTime  = '2013-01-09 00:00:00.000'
    UNION Select CID = 27972, ContractStartTime = '2011-01-04 00:00:00.000', ContractStopTime  = '2013-01-02 00:00:00.000'
    UNION Select CID = 29526, ContractStartTime = '2011-01-28 00:00:00.000', ContractStopTime  = '2012-01-29 00:00:00.000'
    UNION Select CID = 33411, ContractStartTime = '2011-04-28 00:00:00.000', ContractStopTime  = '2011-04-27 00:00:00.000'
    UNION Select CID = 34965, ContractStartTime = '2011-06-14 00:00:00.000', ContractStopTime  = '2012-06-11 00:00:00.000'
    UNION Select CID = 35742, ContractStartTime = '2011-06-07 00:00:00.000', ContractStopTime  = '2011-07-06 00:00:00.000'
    UNION Select CID = 39627, ContractStartTime = '2012-01-12 00:00:00.000', ContractStopTime  = '2013-01-10 00:00:00.000'
    UNION Select CID = 40404, ContractStartTime = '2011-11-30 00:00:00.000', ContractStopTime  = '2012-07-29 00:00:00.000'
    UNION Select CID = 48951, ContractStartTime = '2012-06-21 00:00:00.000', ContractStopTime  = '2012-07-22 00:00:00.000'
    Order by 3
    

    从1月到6月,窗口中有90个活动日的CID

    DECLARE
      @windowStart DATETIME,
      @windowEnd   DATETIME
    SELECT
      @windowStart = '20110101',
      @windowEnd   = '20110701'
    
    SELECT
      *
    FROM
      yourTable
    WHERE
          contractStopTime  >= @windowStart
      AND contractStartTime <  @windowEnd
      AND DATEDIFF(
            DAY,
            CASE WHEN ContractStartTime >= @windowStart THEN contractStartTime ELSE @windowStart END,
            CASE WHEN ContractStopTime  <  @windowEnd   THEN contractStopTime  ELSE @windowEnd   END
          ) >= 90
    
    声明
    @WindowsStart日期时间,
    @窗口结束日期时间
    挑选
    @WindowsStart='20110101',
    @windowEnd='20110701'
    挑选
    *
    从…起
    你的桌子
    哪里
    contractStopTime>=@WindowsStart
    和合同开始时间<@windowEnd
    和DATEDIFF(
    白天
    当ContractStartTime>=@WindowsStart然后ContractStartTime ELSE@WindowsStart END时,
    当ContractStopTime<@windowEnd然后ContractStopTime ELSE@windowEnd时的情况
    ) >= 90
    
    在1月至6月的窗口中有90个活动日的CID

    DECLARE
      @windowStart DATETIME,
      @windowEnd   DATETIME
    SELECT
      @windowStart = '20110101',
      @windowEnd   = '20110701'
    
    SELECT
      *
    FROM
      yourTable
    WHERE
          contractStopTime  >= @windowStart
      AND contractStartTime <  @windowEnd
      AND DATEDIFF(
            DAY,
            CASE WHEN ContractStartTime >= @windowStart THEN contractStartTime ELSE @windowStart END,
            CASE WHEN ContractStopTime  <  @windowEnd   THEN contractStopTime  ELSE @windowEnd   END
          ) >= 90
    
    声明
    @WindowsStart日期时间,
    @窗口结束日期时间
    挑选
    @WindowsStart='20110101',
    @windowEnd='20110701'
    挑选
    *
    从…起
    你的桌子
    哪里
    contractStopTime>=@WindowsStart
    和合同开始时间<@windowEnd
    和DATEDIFF(
    白天
    当ContractStartTime>=@WindowsStart然后ContractStartTime ELSE@WindowsStart END时,
    当ContractStopTime<@windowEnd然后ContractStopTime ELSE@windowEnd时的情况
    ) >= 90
    
    在1月至6月期间,如果CID的活动时间为90天,您是否需要CID?或者,如果有效期至少为90天,并且其中至少有1天在1月至6月?您能否提供一些DDL,以便我们可以复制您的环境?我需要1月1日至6月30日期间有效期至少为90天的合同的CID。如果合同的有效期在1月至6月期间为90天,您是否需要CID?或者,活动期至少为90天,其中至少1天在1月至6月?您能否提供一些DDL,以便我们可以复制您的环境?我需要在1月1日至6月30日期间至少为90天活动的合同的CID。初始化的值似乎相互交换?停止时间应该在6月之前?@Kanavi-不,我个人认为日期的最佳实践是使用
    =并且似乎初始化的值彼此交换?停止时间应该在6月之前?@Kanavi-不,我个人认为日期的最佳实践是使用
    =和