没有结束日期的SQL DateDiff

我正在使用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开始新的治疗如何总结患者获得治疗的日期治疗尽管没有结束日期?

谢谢,

Loperam


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

基本上,将日期/时间值转换为日期,对该日期值进行分组,然后统计有多少。 分组会将重复的日期合并为一个单独的日期,因此您应该根据样本数据得出4个答案。


尝试这个

你需要得到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

你似乎在寻找的是连续几天的序列。 假设您正在使用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,还有其他方法。

链接地址: http://www.djcxy.com/p/64959.html

上一篇: SQL DateDiff without enddate

下一篇: Valgrind does not detect dangerous freeing memory