我正在使用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
答案 0 :(得分:3)
SELECT COUNT(StartDate) AS treatmentDays
FROM ...
WHERE ...
GROUP BY CAST(StartDate as date)
基本上,将日期/时间值转换为日期,对该日期值进行分组,然后计算有多少。分组会将重复的日期合并为一个,因此您应该得到4作为样本数据的答案。
答案 1 :(得分: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
答案 2 :(得分: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,则可以使用其他方法。
答案 3 :(得分:0)
如果您只想获取StartDate
中存在的唯一天数总数,可以使用此功能:
SELECT COUNT(IndividualDays)
FROM
(SELECT DISTINCT CONVERT(VARCHAR(10), StartDate, 111) AS IndividualDays
FROM TreatmentTable) AS A
所有这一切都将datetime
值转换为它们的日期部分,并删除重复项。完成后,返回的行数与唯一天数相同,因此只计算一次。