|
我有一个示例表(table_name:track_task),如下所示:
; n- X# [: b, ~7 y% Etask_id stage log_date---------------------------------------- 3 1111111 -06-011 08:36:21 9 2011111111 -06-12:35::35:47 33 20111112:35:35:37 -06-05 14:25:42 21 201111-06-11 13:03:34 9 20111113:03:34 -06-115:25:57 3 201111115:25:57 201111-06-12 10:16:09 21 201111110:16:00 -06-15 15:30:29 3 20111111115:30:30:29 30 -06-22 15:34:33 21 2011111-06-23 12:53:49 9 2011112:53:49-06-25 16:25:08当应用程序代码中的某些操作进行任务阶段时,上述数据将自动填写。阶段从1到4。然而,由于某种逻辑,任务可能会跳过阶段3。但所有任务都将在阶段4结束。可能的任务路径如下:
/ F' H- V, `' [: j) O6 M7 g/ (1,2,3,4)- Completed tasks(1,2,3) (1,2) - In progress tasks我需要查询和检索一份报告,显示任务在给定时间的每个阶段需要多长时间前为止,我已经提出了以下查询:, \( G$ R/ A% c/ ^
SELECT z.task_id,a.log_date begin_date,d.log_date end_date, DATEDIFF( b.log_date,a.log_date ) step1_days, DATEDIFF( c.log_date,b.log_date ) step2_days, DATEDIFF( d.log_date,c.log_date ) step3_days, DATEDIFF( d.log_date,a.log_date ) cycle_daysFROM track_task zLEFT JOIN track_task a ON ( z.task_id = a.task_id AND a.staging_id =1 )LEFT JOIN track_task b ON ( z.task_id = b.task_id AND b.staging_id =2 )LEFT JOIN track_task c ON ( z.task_id = c.task_id AND c.staging_id =3 )LEFT JOIN track_task d ON ( z.task_id = d.task_id AND d.staging_id =4 )GROUP BY z.oppty_id以下结果集:4 {7 o7 ]1 `' b$ f, v! G
task_id begin_date end_date step1_days step2_days step3_days cycle_days------------------------------------------------------------------------------- 3 201111-06-01 2011-06-2222 4 211 2011111201111 -06-03 2011-06-2555 8 NULL NULL 2222 21 20111111111 -06-11 NULL NULL NULL这是解决问题的好方法还是更好的方法?如何解决问题?NULL值报告为零?如何检索仍在执行的任务?end_date?
5 n% A% Q, X) n7 V* s
+ @) s- K3 {. _ K$ s/ H 解决方案: ) P* V7 X7 {$ ]8 |& n
假设有一个例子,我会怎么做这样的事情?stage每使用task(如果没有,无论是确定你的要求,还是编写查询,都需要更多的工作)。
! x) y* q" Q9 i! W% |) W要使null显示为0,请使用以下内容COALESCE()功能:
! s' E4 P% F9 x& Z" LSELECT z.task_id,COALESCE(DATEDIFF(b.log_date,a.log_date),0) as step1_days |
|