7

我正在使用 SQL Server 我需要知道患者接受治疗的天数。问题是我只能获得 startDate 而不是 endDate 当我运行查询并按 StartDate 排序时,我得到如下信息:

StartDate
2012-10-11 22:00:00.000
2012-10-11 23:10:31.000
2012-10-12 00:28:31.000
2012-10-12 01:39:01.000
2012-10-12 02:09:01.000
2012-10-12 03:39:01.000
2012-10-12 04:38:50.000
2012-10-20 06:00:00.000
2012-10-20 08:06:05.000
2012-10-20 10:21:55.000
2012-10-21 14:13:01.000
2012-10-21 15:13:01.000

我应该得到的答案是 4 天(第 11、12、20 和 21 天) 治疗于 2012 年 10 月 12 日停止,新的治疗于 2012 年 10 月 20 日开始 我如何总结患者接受治疗的天数尽管没有结束日期,但治疗?

谢谢,

洛哌丁胺

4

4 回答 4

3
SELECT COUNT(StartDate) AS treatmentDays
FROM ...
WHERE ...
GROUP BY CAST(StartDate as date)

基本上,将日期/时间值转换为日期,按该日期值分组,然后计算有多少。分组会将重复的日期折叠成一个日期,因此在给定示例数据的情况下,您应该得到 4 作为答案。

于 2012-10-23T19:55:35.673 回答
1

尝试这个

您需要获取DISTINCT日期计数

SELECT A.PATIENT_ID, COUNT(DISTINCT A.DATE)
FROM
(
    SELECT PATIENT_ID, CONVERT(VARCHAR(10), StartDate, 101) AS [DATE] --CONVERTS TO [MM/DD/YYYY] FORMAT
    FROM MY_TABLE
) A
GROUP BY A.PATIENT_ID
于 2012-10-23T20:03:27.073 回答
0

您似乎正在寻找的是连续几天的序列。假设您使用的是 SQL Server 2005 或更高版本,您可以采用以下方法。对于每位患者,仅提取序列中的天数。然后列举天数。对于“治疗”,这些之间的差异将是恒定的。

这是一个例子:

select patientId, seqStartDate, count(*) as NumDays, sum(NumOnDay) as NumRecs,
       dateadd(day, count(*) - 1, seqStartDate) as SeqEndDate
from (select dp.*,
             row_number() over (partition by patientId order by StartDate) as seqnum,
             dateadd(day, 
                     - row_number() over (partition by patientId order by StartDate)
                     StartDate
                     ) as seqStartDate
      from (select cast(StartDate as date) as thedate, patientId, count(*) as NumOnDay
            from table
            group by cast(StartDate as date), patientId
           ) dp
     ) dp
group by patientId, seqStartDate
order by 1, 2

实际上,此语法也使用cast(<val> as date)SQL Server 2008 语法来删除时间组件。如果您使用的是 SQL Server 2005,还有其他方法。

于 2012-10-23T20:07:02.870 回答
0

如果您只想获取 中存在的唯一天数,StartDate可以使用以下命令:

SELECT COUNT(IndividualDays)
FROM
    (SELECT DISTINCT CONVERT(VARCHAR(10), StartDate, 111) AS IndividualDays
     FROM TreatmentTable) AS A

所有这一切都是将datetime值转换为它们的日期部分,并删除重复项。完成后,返回的行数与唯一天数相同,所以它只是得到一个计数。

于 2012-10-23T20:10:47.287 回答