回答

收藏

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

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

在MySQL查询中,我使用 timediff / time_to_sec 函数计算两个日期时间之间的总分钟数。+ _/ e, @0 Y& @2 ?$ J# C9 e
例如:; J5 a  }8 V4 t3 P; F4 A
2010-03-23 10:00:00/ S) R: ]2 \) S7 s& @, V# I
-
, r- k5 Y8 b. J1 X0 j7 I2010-03-23 08:00:00; T; x: w+ A3 t% v/ c' w
= 120 minutes2 b% G/ q+ r' A* C; u7 I
我想做的是排除在选定时间范围内发生的任何休息。
- L9 Z. C3 J% O: @# G例如:+ l: Z- M# n0 @6 s/ K! I: J
2010-03-23 10:00:00
# F' X. v: F3 b( P-
- ~' L4 Z& q, S$ O0 w: `2010-03-23 08:00:00
8 k# o& ~, b1 v" c3 F0 [$ t-' L& R6 V: z* m3 T
(break 08:55:00 to 09:10:00)
. U& I: o0 j7 E$ i4 ~- U= 105 minutes, ^2 U; A+ k# ^1 D/ C& Q6 S
是否有一个好的方法可以做到这一点而无需求助于一长串的嵌套IF语句?! h; Q; d6 @2 L- x& O4 X
UPDATE1:
: I! N/ G$ h( ^- Y$ m& ]为了澄清-我正在尝试计算用户完成给定任务所需的时间。如果他们喝咖啡休息时间,则需要排除该时间段。茶歇时间为固定时间。
" ~* ^4 t0 `6 G2 l5 K! `               
0 d& L: Y6 u5 i4 w: E7 A解决方案:8 I. e7 A4 I6 Z$ s
               
; V' N2 d6 \! n/ e6 B
, ^1 Z4 s+ f2 X, T' |* @' z2 g$ g
/ M0 r' G/ s, J' U                将所有您在这段时间内发生的休息时间相加,然后减去timediff / time_to_sec函数的结果
) g0 X2 h/ j  l) M* o( CSELECT TIME_TO_SEC(TIMEDIFF('17:00:00', '09:00:00')) -- 288002 A4 A0 t: t. f7 l& o3 e
SELECT TIME_TO_SEC(TIMEDIFF('12:30:00', '12:00:00')) -- 1800
8 o' h6 a' a2 S1 b, M/ [SELECT TIME_TO_SEC(TIMEDIFF('10:30:00', '10:15:00')) -- 900
* K$ C9 R' ?( O  h-- 26100/ }* B: i) }$ k9 |! p' z' U3 b
假设这个结构:
+ ?% R. k3 ~( e0 i" _CREATE TABLE work_unit (
/ Z! r( T. R: k: @1 f) D, r id INT NOT NULL,
$ C9 c4 I% ^' r2 ]9 f) z initial_time TIME,
' C. B) _# P/ g/ M/ o0 \ final_time TIME1 h9 R( B: D; c
)
* m9 _& V5 e7 k$ l$ O5 {. {* N8 CCREATE TABLE break (9 |+ }/ P& v0 Q# n7 C
id INT NOT NULL,% c3 y3 q6 M  d$ A
initial_time TIME,) b4 Y( A' O* p& I( D
final_time TIME
* j! L  O' y0 [0 I, n) c  {)
  I! p9 \4 x: H( ]1 w2 V# \. ZINSERT work_unit VALUES (1, '09:00:00', '17:00:00')
" Z0 [& W& W; b0 j* v$ \$ C8 pINSERT break VALUES (1, '10:00:00', '10:15:00')( f, V0 @5 ^+ o! W$ z' ~
INSERT break VALUES (2, '12:00:00', '12:30:00')
* Q7 {- m8 S' ^  n$ T' d2 Z您可以使用下一个查询来计算它:* c8 n4 E+ p) d2 n7 G# k. T( A
SELECT *, TIME_TO_SEC(TIMEDIFF(final_time, initial_time)) total_time
# |# P6 s( V3 f) I: y0 m. I, (SELECT SUM() d, B3 t! p5 C. ^4 {
TIME_TO_SEC(TIMEDIFF(b.final_time, b.initial_time)))
8 U$ c7 e; s- c. D! H' ?  FROM break b 3 y! O) i* M- h; s9 Y
  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)
0 X" Z2 ]8 w( ^7 m& v5 p ) breaks * _$ y/ f" }' O! M# ?9 W
FROM work_unit
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则