MS SQL在特定日期重复发生

时间:2015-03-24 11:20:12

标签: sql-server-2008

我有下面的查询,它给了我特定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 'Εγγραφή/Ερωτηματολόγιο/Έρευνα%'

)

1 个答案:

答案 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列有点像锚列,根据该列获取下一个“开始日期”。