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 天期间,第 1 行填补了这一空白。因此,对于第 1 行和第 2 行之间的间隙,我需要显示的结束编号是 3。

任何帮助将不胜感激。

谢谢。

4

1 回答 1

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

--涵盖的天数

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

--总天数

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

--合并

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 天。但是您可以决定承保范围是从 rx 日期还是后一天开始。

于 2013-06-05T15:59:07.493 回答