我有一個持有狀態更新的平坦表。SQL數據庫日期範圍
這些更新存儲在以下格式:
AGREEMENTID | StatusID | StatusDate
源數據:
AgreementID StatusID StatusDate
109 1 14/01/2013 15:00:33
109 2 14/01/2013 15:01:28
109 2 14/01/2013 15:01:28
109 2 14/01/2013 15:02:42
109 2 26/02/2013 16:27:38
109 2 26/02/2013 16:27:45
109 8 19/02/2013 13:57:33
109 8 04/03/2013 16:46:29
109 8 18/03/2013 14:08:12
109 8 18/03/2013 14:47:00
109 8 18/03/2013 14:48:46
109 9 26/03/2013 15:41:51
我所需要的就是映射在日期範圍的協議狀態,一個協議可以有相同的StatusID的多個狀態更新,而一旦協議進入到下一個StatusID它不能退回到以前的狀態ID。
對於上一個狀態,日期範圍應該是StatusDate To Date。
我有下面一段代碼,但結果不給我我想要的東西......
SELECT
AgreementID,
CONVERT(datetime, CONVERT(varchar(10), StatusDate, 103), 103) AS StatusDate,
CONVERT(datetime, CONVERT(varchar(10), StatusDate, 103), 103) AS DateFrom,
CASE WHEN DateTo IS NULL THEN CONVERT(datetime, CONVERT(varchar(10), GETDATE(), 103), 103) ELSE CONVERT(datetime, CONVERT(varchar(10), DateTo, 103), 103) END AS DateTo,
StatusID
FROM
(
SELECT
AgreementID,
StatusID,
StatusDate,
(SELECT TOP (1) StatusDate FROM TblStatusUpdates AS SU WHERE SU.AgreementID = U.AgreementID AND SU.StatusDate > U.StatusDate ORDER BY StatusID, StatusDate ASC) DateTo,
RN = ROW_NUMBER() OVER (Partition BY AgreementID ORDER BY StatusDate)
FROM
(
SELECT
AgreementID,
StatusID,
MIN(StatusDate) AS StatusDate
FROM
TblStatusUpdates
GROUP BY
AgreementID, StatusID
) AS U
) AS A
下面是該查詢的結果舉例:
AgreementID StatusDate DateFrom DateTo StatusID
109 14/01/2013 14/01/2013 14/01/2013 1
109 14/01/2013 14/01/2013 14/01/2013 2
109 19/02/2013 19/02/2013 26/02/2013 8
109 26/03/2013 26/03/2013 25/04/2013 9
由於你可以看到,日期到價值是不正確的,它應該總是運行到下一個狀態ID的前一天。
因此,在這個例子中,然後狀態2應從19/02/2013運行,以18/02/13
任何建議將是巨大的。謝謝。
只是一個快速的評論:[STOP DECLARING VARCHAR無長](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without- length.aspx)。這是懶惰和有問題的。 – 2013-04-25 15:52:57
它在哪裏聲明沒有長度? – 2013-04-25 15:58:29
'CONVERT(varchar,'all over the place。'varchar(WHAT?)'? – 2013-04-25 15:59:47