回答

收藏

在mysql查询中计算日期和持续时间

技术问答 技术问答 227 人阅读 | 0 人回复 | 2023-09-12

我有一个示例表(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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则