2013-06-05 210 views
1

我正在使用SQL Server 2008 R2並試圖創建一個將顯示日期是否重疊的查詢。如何查詢重疊日期範圍?

我試圖計算某人在某個標準下被覆蓋的天數。下面是表的一個例子...

CREATE TABLE mytable 
( 

CARDNBR varchar(10) 
GPI char(14) , 
GPI_DESCRIPTION_10 varchar(50) , 
RX_DATE datetime , 
DAYS_SUPPLY int , 
END_DT datetime , 
METRIC_QUANTITY float 

)  
INSERT INTO mytable VALUES ('1234567890','27200040000315','Glyburide','01/30/2013','30','03/01/2013','60')  
INSERT INTO mytable VALUES ('1234567890','27200040000315','Glyburide','03/04/2013','30','04/03/2013','60')  
INSERT INTO mytable VALUES ('1234567890','27250050007520','Metformin','01/03/2013','30','02/02/2013','120')  
INSERT INTO mytable VALUES ('1234567890','27250050007520','Metformin','02/27/2013','30','03/29/2013','120') 

我希望能算天,一個人從第一RX_DATE到最後END_DT,在本例中爲90天覆蓋的數量( 4/3/13 - 1/3/13)。

這部分已完成,但這是我陷入困境的地方。

在第1行和第2行之間,有3天沒有服用藥物。第3排和第4排之間有25天的時間。然而,在這25天的時間裏,第一行就是彌補了這一差距。所以我需要顯示的最終數字是3行1和2之間的差距。

任何幫助將不勝感激。

謝謝。

+0

請顯示您嘗試過哪些查詢無效。 –

回答

1

有可能是一個更好的方法,但你可以創建天的查找,加入到它,並選擇不同的日子,加盟,將讓你的天覆蓋所有線路總數:

CREATE TABLE #lkp_Calendar (Dt DATE) 
GO 
SET NOCOUNT ON 
DECLARE @intFlag INT 
SET @intFlag = 1 
WHILE (@intFlag <=500) 
BEGIN 
--Loop through this: 
INSERT INTO #lkp_Calendar 
SELECT DATEADD(day,@intFlag,'20120101') 
SET @intFlag = @intFlag + 1 
END 
GO 

--days覆蓋

SELECT CARDNBR, COUNT(DISTINCT b.Dt)CT 
FROM #mytable a 
JOIN #lkp_Calendar b 
    ON b.Dt BETWEEN a.RX_DATE AND a.END_DT 
GROUP BY CARDNBR 

--Total天

SELECT CARDNBR, DATEDIFF(DAY,MIN(RX_DATE),MAX(END_DT))+1 'Total_Days' 
     FROM #mytable 
     GROUP BY CARDNBR 

--Combined

SELECT covered.CARDNBR, covered.CT 'Days Covered', total.Total_Days 'Total Days', total.Total_Days - covered.CT 'Days Gap' 
FROM (SELECT CARDNBR, COUNT(DISTINCT b.Dt)CT 
     FROM #mytable a 
     JOIN #lkp_Calendar b 
      ON b.Dt BETWEEN a.RX_DATE AND a.END_DT 
     GROUP BY CARDNBR 
    )covered 
JOIN (SELECT CARDNBR, DATEDIFF(DAY,MIN(RX_DATE),MAX(END_DT))+1 'Total_Days' 
     FROM #mytable 
     GROUP BY CARDNBR 
    )total 
ON covered.CARDNBR = total.CARDNBR 

你說的90天,但我相信你應該有91日期差異從週一至週三僅2中,但這是覆蓋3天。但是您可以決定是在保留日期還是後一天開始保險。

+0

這只是給我一個91的返回值,這只是數日。我可以指望這些日子,但我需要指出哪裏沒有任何藥物可以覆蓋。 – Phil

+0

在你的例子中沒有差距,除非你正在尋找每種藥物。 1和2之間的差距由4覆蓋。 –

+0

我甚至沒有看到。這太棒了。非常感謝!!!! – Phil