Sql 查找至少90天内处于活动状态的所有合同
我需要找到所有CID(合同)都满足以下条件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年前六个月的天数,则包括该合同 有更好的办法吗 下面是如何生成数据
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-不,我个人认为日期的最佳实践是使用=和