回答

收藏

MySQL-计算两个日期时间之间的净时间差,同时排除休息时间?

技术问答 技术问答 299 人阅读 | 0 人回复 | 2023-09-13

在MySQL查询中,我使用 timediff / time_to_sec 函数计算两个日期时间之间的总分钟数。
0 U5 _1 a) e, W, a# t5 {0 M例如:
8 r0 Z$ q" t( j: U9 Y5 Q2010-03-23 10:00:005 X( o6 f( F9 H" h- K$ c, z$ S1 z4 m
-9 y! @+ E, k1 k$ T
2010-03-23 08:00:009 O+ |1 n1 H7 S
= 120 minutes
; f8 ^1 U3 t% W我想做的是排除在选定时间范围内发生的任何休息。  l4 G+ L% E& \: w+ c' J) v
例如:/ s) u3 z, M6 H( w6 v
2010-03-23 10:00:009 G! p+ _0 t" J) J3 d8 z
-5 c6 X5 L* f4 P, K, I& U/ ~$ i
2010-03-23 08:00:00
( y" H3 f0 F% D, W! ]-
- D' x" Z: }4 W* L% l: a(break 08:55:00 to 09:10:00)
% n' v) I! [! B( n: @' b2 b/ G= 105 minutes
+ n7 o& }) T! L# g7 H3 Z是否有一个好的方法可以做到这一点而无需求助于一长串的嵌套IF语句?9 W& N$ p; N/ b2 s2 l# G! u
UPDATE1:
- @7 f6 J$ c% L. s  h  @- J# Z7 h为了澄清-我正在尝试计算用户完成给定任务所需的时间。如果他们喝咖啡休息时间,则需要排除该时间段。茶歇时间为固定时间。2 s4 [/ ]0 X7 s: E) G
                : c$ n- B2 x* f/ o( K8 w
解决方案:. e7 @3 m2 X# ~. a" g
               
* V! j* \" [+ K6 @
, d: c4 a- I- [% X( Z- Q0 s/ r2 c" }$ E, p
                将所有您在这段时间内发生的休息时间相加,然后减去timediff / time_to_sec函数的结果. u+ X, y/ l* ]% }( c7 ?
SELECT TIME_TO_SEC(TIMEDIFF('17:00:00', '09:00:00')) -- 28800
( L% A, v0 y, F1 kSELECT TIME_TO_SEC(TIMEDIFF('12:30:00', '12:00:00')) -- 1800% \1 ~& Q* b! q8 _; y
SELECT TIME_TO_SEC(TIMEDIFF('10:30:00', '10:15:00')) -- 900
; S7 v( t' y7 b-- 26100
% q* V. c7 d9 V5 E6 l  B假设这个结构:# u0 n& _  ?% Y8 w4 l8 U3 L: K" H( x; n- C
CREATE TABLE work_unit (" L( `+ ?9 {, q8 ]- {* ^' a9 C- U' p
id INT NOT NULL,
# V4 n4 |# p3 f! a, Q+ U initial_time TIME,
3 a2 q, w& i4 O  C final_time TIME) _9 M. O. Z. M; Z* R' O& E: z9 E
)
5 T# |& N% W9 ]9 Q$ tCREATE TABLE break (: n% i, h% `7 l4 W) \% I  a8 o
id INT NOT NULL,6 K4 p6 N. f7 q, W3 z& i- t0 O1 f
initial_time TIME,
3 ?- i+ h% O, L* J' h6 Q; N" Q: N final_time TIME
4 X( Q7 Z8 U8 R, C) ~1 N)) T$ H8 [& \( n* `. s# ]( ]
INSERT work_unit VALUES (1, '09:00:00', '17:00:00')
9 P: I; m3 _6 ~0 w' ZINSERT break VALUES (1, '10:00:00', '10:15:00')& }! I' h  n5 w) o; b7 F# M
INSERT break VALUES (2, '12:00:00', '12:30:00')$ Q" C0 F: D+ r
您可以使用下一个查询来计算它:
- H$ |: ]' C* j. A  [/ f, RSELECT *, TIME_TO_SEC(TIMEDIFF(final_time, initial_time)) total_time
2 j4 L8 u4 h8 \, (SELECT SUM(0 ]' R/ Y/ z  \* K
TIME_TO_SEC(TIMEDIFF(b.final_time, b.initial_time))): \5 T  u. w  n9 X# K% C! z$ V
  FROM break b   b. {/ f. A5 H+ j
  WHERE (b.initial_time BETWEEN work_unit.initial_time AND work_unit.final_time) OR (b.final_time BETWEEN work_unit.initial_time AND work_unit.final_time)
/ S% d; ]# A3 n: L" V ) breaks + z7 v9 |/ Q# H/ g7 Z5 H# t. N
FROM work_unit
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则