Sql 如何查询重叠的日期范围?

Sql 如何查询重叠的日期范围?,sql,sql-server,datetime,overlapping,Sql,Sql Server,Datetime,Overlapping,我正在使用SQLServer2008R2,并试图创建一个查询来显示日期是否重叠 我试图计算一个人在某个标准下被覆盖的天数。下面是表格的一个示例 CREATE TABLE mytable ( CARDNBR varchar(10) GPI char(14) , GPI_DESCRIPTION_10 varchar(50) , RX_DATE datetime , DAYS_SUPPLY int , END_DT datetime , METRIC_QUANTI

我正在使用SQLServer2008R2,并试图创建一个查询来显示日期是否重叠

我试图计算一个人在某个标准下被覆盖的天数。下面是表格的一个示例

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') 
我希望能够计算一个人从第一个接收日期到最后一个结束日期的受保天数,在本例中为90天(4/3/13-1/3/13)

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

在第1行和第2行之间,有3天的时间没有服用任何药物。第3行和第4行之间有一个25天的周期。然而,在这25天期间,第1行弥补了这一差距。所以我需要显示的结束号是3,表示第1行和第2行之间的间隙

任何帮助都将不胜感激


谢谢。

可能有更好的方法,但您可以创建天数查找,加入其中并选择加入的不同天数,这将获得所有行的总天数:

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, DATEDIFF(DAY,MIN(RX_DATE),MAX(END_DT))+1 'Total_Days'
        FROM #mytable
        GROUP BY CARDNBR
--合二为一


你说90天,但我相信你应该有91天。从周一到周三的日期差仅为2天,但涵盖3天。但是您可以决定是从接收日期还是从接收日期后的第二天开始覆盖。

可能有更好的方法,但您可以创建天数查找,加入到其中并选择加入的不同天数,这将获得所有行覆盖的总天数:

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, DATEDIFF(DAY,MIN(RX_DATE),MAX(END_DT))+1 'Total_Days'
        FROM #mytable
        GROUP BY CARDNBR
--合二为一


你说90天,但我相信你应该有91天。从周一到周三的日期差仅为2天,但涵盖3天。但您可以决定是在接收日期还是次日开始承保。

请显示您尝试过的哪些查询不起作用。请显示您尝试过的哪些查询不起作用。这只会给我一个返回值91,这只是在计算天数。我可以计算天数,但我需要计算哪些地方没有任何药物的覆盖率。在您的示例中,没有差距,除非您查找每种药物。1和2之间的差距被4所覆盖。这给了我一个91的返回值,这只是计算天数。我可以计算天数,但我需要计算哪些地方没有任何药物的覆盖率。在您的示例中,没有差距,除非您查找每种药物。1和2之间的间隙由4覆盖。