如何查询重叠日期范围?

时间:2013-06-05 15:44:55

标签: sql sql-server datetime overlapping

我正在使用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天(2013年4月3日 - 1月3日)。 / p>

那部分已经完成,但这是我遇到麻烦的地方。

在第1行和第2行之间,有3天的时间没有吸毒。在第3行和第4行之间有25天的时间。但是,在那25天期间,第1行覆盖了这一差距。因此,对于第1行和第2行之间的差距,我需要显示的结束数为3。

非常感谢任何帮助。

感谢。

1 个答案:

答案 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

- 涵盖天数

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日期或第二天开始报道。