我有下面的查询,它给了我特定serviceid的患者,没有任何serviceinterrupt = 1。
我想要做的是更改下面的日期,
and incident.completionDate Between Convert(smalldatetime, '01/01/2015', 103) and Convert(smalldatetime, '21/02/2015', 103)
执行以下操作: 2015年2月21日应该是今天()而不是特定日期。 和数据01/01/2015,应该是从2014年1月1日到今天()的每个月的第一天。
所以每次运行查询时,我都会得到我想要的病人数,从2014年1月1日起,每个月的第1天,直到今天()。
我怎样才能从2014年1月1日到今天再次(每1 /月)?(
SELECT distinct patient.id, upper (city) as City
from patient
inner join ............
where
(
patient.id IN
(
select distinct
Patient.id as Patient_ID--, upper (city) as City
from Patient
inner join .....
where i1.serviceId in (4,5,6,29)
and status = 3
and Patient.id NOT IN (
select i2.patientConcerned
from Incident i2
where
i2.serviceid = i1.serviceid
AND i2.ServiceInterrupt != 0
)
)
OR
patient.id IN
(
Select distinct
patient.id as Patient_ID
from patient
inner join ....
where
incident.serviceId IN (4,5,6,29)
AND incident.ServiceInterrupt != 0
and incident.status = 3
and incident.completionDate Between Convert(smalldatetime, '01/01/2015', 103) and Convert(smalldatetime, '21/02/2015', 103)
)
)
AND
patient.id NOT IN
(
SELECT distinct patient.id as Patient_ID
FROM dbo.IncidentCharges
INNER JOIN ....
WHERE
incident.completionDate Between Convert(smalldatetime, '01/01/2015', 103) and Convert(smalldatetime, '21/02/2015', 103)
and
servicecharges.serviceid in (4,5,6,29)
and incident.status = 3 --completed incidents
and ServiceCharges.chargeDescr like 'Εγγραφή/Ερωτηματολόγιο/Έρευνα%'
)
答案 0 :(得分:0)
我的回答只关注获取日期部分。您需要填写此内容并将其用作原始查询中的块
使用recursive CTE
重复从2014年1月1日开始的每个月的第一天,直到当前日期的当月的第一个日期。
;WITH CTE AS
(--gets you data from 01/01/2014 till current date
SELECT foo, bar, Convert(smalldatetime, '01/01/2014', 103) start
FROM dbo.IncidentCharges incident WHERE incident.completionDate Between
Convert(smalldatetime, '01/01/2014', 103) and Convert(smalldatetime, GETDATE(), 103)
UNION ALL
--gets you data from the next months start date till current date
SELECT foo, bar, CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,start))-1),DATEADD(mm,1,start)),103) start
FROM cte incident WHERE incident.completionDate Between
CONVERT(smalldatetime,DATEADD(dd,-(DAY(DATEADD(mm,1,start))-1),DATEADD(mm,1,start)),103) and Convert(smalldatetime, GETDATE(), 103)
and CONVERT(smalldatetime,DATEADD(dd,-(DAY(DATEADD(mm,1,start))-1),DATEADD(mm,1,start)),103) <= Convert(smalldatetime, GETDATE(), 103)
)
select * from cte
getdate()
将为您提供当前日期,而CONVERT(smalldatetime,DATEADD(dd,-(DAY(DATEADD(mm,1,start))-1),DATEADD(mm,1,start)),103)
将在下个月的第一天为您提供。
start
列有点像锚列,根据该列获取下一个“开始日期”。