2017-04-14 18 views
2

我想弄清楚如何在R,D或C状态下只包括PPO/PPB任务,如果在R或D中,只包括在前一个月内完成的任务。TSQL:或上个月的状态

select 
d.Address 'Property Address', 
d.Client_id 'Client ID', 
t.vendor 'Vendor Name', 
t.req_dt 'Date Task Ordered', 
t.due_dt 'Date Task Due', 
case 
when t.status = 'D' then 'Done' 
when t.status = 'C' then 'Cancel' 
when t.status = 'R' then 'Received' 
else '' 
End 'Task Status', 
t.task_type, 
d.portfolio 
,am.last AssetManagerLastName 
,t.done_dt TaskDoneDate 
,e.submitted_dt 'Completed Date' 
,DATEDIFF(day,t.req_dt,e.submitted_dt) AS [Days to Complete] 
from resnet_mysql..property_details d 
join resnet_mysql..property_tasks t on t.property_id = d.property_id 
left join resnet_mysql..property_exps e on e.property_id = t.property_id and 
e.task_id = t.task_id 
left join resnet_mysql.dbo.asset_mgrs AM on AM.am_id=d.am_id 
where d.res_id = 125 and t.task_type in('PPB', 'PPO') 
and 
t.status = ('C') 
OR (
    t.status IN ('R' ,'D') 
    AND 
     t.done_dt = DATEADD(month, -1, GETDATE())) 
order by t.vendor, t.task_type, t.req_dt desc 

enter image description here

回答

1

t.done_dt = DATEADD(month, -1, GETDATE()))目前得到了一个月的今天,这是3/13,这意味着你会错过的日子,其余的诠释,他一个月。如果您想要上个月的整个月份,请查找上个月的第一个月和上个月的最后一个月。

t.done_dt >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) 
AND 
t.done_dt < DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, 0) 

第二个表达式查找<第一当月,以确保我们在where子句中得到的记录,像3/31/2017 23:59:59

where 
    (d.res_id = 125 and t.task_type in('PPB', 'PPO')) 
    and 
    (t.status = ('C') OR (
         t.status IN ('R' ,'D') 
         AND 
         t.done_dt >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) 
         AND 
         t.done_dt < DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, 0) 
         ) 
    ) 
+0

感谢这个日期确实有效,但现在由于某种原因,我似乎无法得到查询中的所有3个状态。它只给了我'D'的地位。 – IeeTeY

+0

@leeTey这是一个括号分组,我怀疑...看到我的编辑。 – scsimon

+0

现在它只给我'C'状态:(。 – IeeTeY

1

筛选与or条件。请注意,下面的sql是为了举例说明,以适当的方式重新命名。

SELECT * 
    FROM TABLE 
    WHERE task_type IN ('PPO', 'PPB') 
     AND 
     ( 
      task ='C' 
       OR 
      (task IN ('R','D') AND [Date Task Ordered] BETWEEN CONVERT(DATE, DATEADD(d, -(DAY(DATEADD(m, -1, GETDATE() - 2))), DATEADD(m, -1, GETDATE() - 1))) 
      AND CONVERT(DATE, DATEADD(d, -(DAY(GETDATE())), GETDATE()))) 
     )