SQL Server 中带有日期的存储函数

问题描述 投票:0回答:2

每条线代表一位服用两种药物的患者。

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 中如何工作,或者如何使用过程添加额外的列。

sql sql-server stored-procedures
2个回答
0
投票

查询以查找重叠日期(如果存在)。我修改了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

0
投票

这里是如何使用 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

这只给出存在重叠的结果。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.