2012-06-28 42 views
0

活躍,我需要找到所有的CID(合同)符合下列條件查找是至少90天

  1. 他們是2011年1月1日和2011年6月30日(間活躍之前或之後開始的所有合同截止開始日期,之前或截止結束日期)結束,但他們必須在此期間進行活躍
  2. 他們活躍於2011年1月1日和2011年6月30日
之間至少90天

我能想到的唯一解決方案是unpivot,這樣在日期範圍內每天的re爲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

是否需要CID的,他們的活動時間有90天在一月至六月的窗口?或者活動期至少90天,並且其中至少1天是在1月至6月? – MatBailie

+0

你能否提供一些DDL,以便我們可以複製你的環境? – CJM

+0

我需要在1月1日至6月30日期間至少90天有效的合約的CID。 –

回答

3

CID的有90活躍天數在窗口一月到六月...

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 
+0

似乎已初始化的值會彼此交換?停止時間應該在六月之前? – Pankaj

+0

@Kanavi - 不,我個人對日期最佳做法的信仰是使用'> = AND <'。在這種情況下,我使用了'<'20110701',這是2011年7月1日之前的所有內容。無論使用何種數據類型或時間組件,都可以確保包含6月份的* all *。 – MatBailie

相關問題