我正在使用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。
非常感谢任何帮助。
感谢。
答案 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日期或第二天开始报道。