每条线代表一位服用两种药物的患者。
RX_START_DATE | RX_END_DATE | OTHER_RX_START_DATE | OTHER_RX_END_DATE |
---|---|---|---|
2023年5月5日 | 2023年7月5日 | 2023年6月5日 | 2023年8月5日 |
2023年1月3日 | 2023/03/03 | 2024年2月3日 | 2024年4月3日 |
我需要代码来查找最晚开始日期和最早结束日期,以确保日期范围适用于患者服用组合药物的时间。
在上面第一行的表格示例中,我想要
COMBO_START_DATE = 06/05/2023
和 COMBO_END_DATE = 07/05/2023
,因为这将是它们重叠的时候。
我不太确定该怎么做。我打算编写一个存储过程,但我不确定 if-then 语句在 T-SQL 中如何工作,或者如何使用过程添加额外的列。
查询以查找重叠日期(如果存在)。我修改了here的解决方案并将其应用到您的示例中。我认为对于这个问题,CASE 比 IF 效果更好。
SELECT *,
CASE WHEN RX_START_DATE < OTHER_RX_START_DATE
THEN OTHER_RX_START_DATE
ELSE RX_START_DATE
END as COMBO_START_DATE,
CASE WHEN RX_END_DATE > OTHER_RX_END_DATE
THEN OTHER_RX_END_DATE
ELSE RX_END_DATE
END as COMBO_END_DATE
FROM Example
WHERE
--(StartA <= EndB) and (EndA >= StartB)
(RX_START_DATE <= OTHER_RX_END_DATE) AND (RX_END_DATE >= OTHER_RX_START_DATE)
RX_START_DATE | RX_END_DATE | OTHER_RX_START_DATE | OTHER_RX_END_DATE | COMBO_START_DATE | COMBO_END_DATE |
---|---|---|---|---|---|
2023-05-05 | 2023-07-05 | 2023-06-05 | 2023-08-05 | 2023-06-05 | 2023-07-05 |
这里是如何使用 CASE 的示例:
DROP TABLE #Temp
CREATE TABLE #Temp (
RX_START_DATE DATE,
RX_END_DATE DATE,
OTHER_RX_START_DATE DATE,
OTHER_RX_END_DATE DATE)
INSERT INTO #Temp
VALUES
('2023-05-05','2023-07-05','2023-06-05','2023-08-05'),
('2023-01-03','2023-03-03','2024-02-03','2024-04-03')
SELECT
t.RX_START_DATE,
t.RX_END_DATE,
t.OTHER_RX_START_DATE,
t.OTHER_RX_END_DATE,
CASE
WHEN t.RX_START_DATE > t.OTHER_RX_START_DATE THEN t.RX_START_DATE
ELSE t.OTHER_RX_START_DATE
END AS COMBO_START_DATE,
CASE
WHEN T.RX_END_DATE < T.OTHER_RX_END_DATE THEN t.RX_END_DATE
ELSE t.OTHER_RX_END_DATE
END AS COMBO_END_DATE
FROM #Temp t
WHERE
t.RX_START_DATE <= t.OTHER_RX_END_DATE
AND t.RX_END_DATE >= t.OTHER_RX_START_DATE
结果是:
RX_START_DATE | RX_END_DATE | OTHER_RX_START_DATE | OTHER_RX_END_DATE | COMBO_START_DATE | COMBO_END_DATE |
---|---|---|---|---|---|
2023-05-05 | 2023-07-05 | 2023-06-0 | 2023-08-05 | 2023-06-05 | 2023-07-05 |
这只给出存在重叠的结果。