0

すべての CID (契約) が次の条件を満たしていることを確認する必要があります

  1. 2011 年 1 月 1 日から 2011 年 6 月 30 日まで有効ですが (カットオフ開始日の前または後に開始でき、カットオフ終了日の前または後に終了できます)、これらの日付の間はアクティブである必要があります。
  2. 2011 年 1 月 1 日から 2011 年 6 月 30 日までの 90 日間以上アクティブである

私が考えることができる唯一の解決策はunpivot、日付範囲内の各日を 1 にし、その範囲外の日を 0 にすることです。次に、1 を合計し、それが 2011 年の最初の 6 か月の日数より多い場合は、その契約を含めることができます。

より良い方法はありますか?

データの作り方はこちら

      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
4

1 に答える 1

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
于 2012-06-28T16:43:10.807 に答える