|
在MySQL查询中,我使用 timediff / time_to_sec 函数计算两个日期时间之间的总分钟数。4 D% l! ~% _: I- X3 d9 Q( P
例如:% ^* c/ ^6 H+ ?
2010-03-23 10:00:00! H9 O& k5 H9 j! O5 i; W: ^
-
4 b* R6 Q, i6 [: @5 T" H. S$ ~# [8 D2010-03-23 08:00:00# @2 {1 P0 S. s6 t
= 120 minutes& [7 ?& T( Q7 E+ K; _5 O
我想做的是排除在选定时间范围内发生的任何休息。2 y7 z) D" i, |! `
例如:
9 f/ f' z! N' \8 ~' ^. [6 h2010-03-23 10:00:00
% z* g- M$ S# D0 o7 O' d; u/ y. p-
/ E5 Z9 Z. o3 T$ o2010-03-23 08:00:00
; o' q0 S5 B0 ^+ l; V$ C-, W2 _' m- S$ [9 \" ^, u |
(break 08:55:00 to 09:10:00)6 w8 @# x4 Y; g% ~8 R6 L! X
= 105 minutes
+ V" }" _9 b) j& a3 R0 E是否有一个好的方法可以做到这一点而无需求助于一长串的嵌套IF语句?$ ]; B7 I/ b- m- v7 E5 `. h' v
UPDATE1:7 Y1 |) ?9 `% o& x: P1 t; Q y$ V
为了澄清-我正在尝试计算用户完成给定任务所需的时间。如果他们喝咖啡休息时间,则需要排除该时间段。茶歇时间为固定时间。
# u F- j! x1 m" ^5 N% z4 r1 b: t
& H Z4 V, ?% D/ R解决方案:
4 y( ]! b" x( y; Q/ r# _ + D4 Z! D$ g. `( Z. x! e! P3 A6 Y
! w* n6 ?, q8 R1 `* e2 @1 n5 k+ p% F- `
将所有您在这段时间内发生的休息时间相加,然后减去timediff / time_to_sec函数的结果2 ^" B8 l. l) A; Q+ z7 B" L$ d7 Q
SELECT TIME_TO_SEC(TIMEDIFF('17:00:00', '09:00:00')) -- 28800
8 H5 `3 _$ K- `. c X# [" ~3 XSELECT TIME_TO_SEC(TIMEDIFF('12:30:00', '12:00:00')) -- 1800% ], ]& Z3 ~5 g k8 b
SELECT TIME_TO_SEC(TIMEDIFF('10:30:00', '10:15:00')) -- 900
% m% z* y; e. k1 D-- 26100
8 W# G+ F. {8 z+ m+ v" O假设这个结构:% B5 ~2 p0 p. Y% C/ c
CREATE TABLE work_unit (5 s1 ?) G- R1 _% [, ~
id INT NOT NULL,# G3 L8 @$ a, {; A7 z6 u6 S' q! C3 L+ q
initial_time TIME,
1 M; q; o' g. O4 z3 R! F. M- W( _" T final_time TIME
( C' o+ o7 g! ~)' [2 _4 X+ n( { H/ N
CREATE TABLE break (; U" U# s: m `: l% J- H
id INT NOT NULL,/ d% a% t# Y! L; v# ]0 F( l
initial_time TIME," e. Y; I8 j; X. p) J
final_time TIME: A: N/ s8 W# A
)3 _' N1 C& d$ o3 F F
INSERT work_unit VALUES (1, '09:00:00', '17:00:00')
2 o3 v9 x( f, s9 `INSERT break VALUES (1, '10:00:00', '10:15:00')
& V" g$ Y- m" u, l: QINSERT break VALUES (2, '12:00:00', '12:30:00')
+ U$ z* Y# R) W: A0 H( C& a- O您可以使用下一个查询来计算它:; ]7 t5 t! Q# [4 j1 q
SELECT *, TIME_TO_SEC(TIMEDIFF(final_time, initial_time)) total_time
9 Q+ {! K: Y8 [6 }9 \2 o/ ^, (SELECT SUM(: g) `# K" H8 q5 {0 o
TIME_TO_SEC(TIMEDIFF(b.final_time, b.initial_time)))
" ?. L) B: e" |; O/ T2 D FROM break b
( ~4 T2 b5 F, Q' ] 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)
3 K! c, L/ U/ {5 L8 b( S' a1 d ) breaks * t; L* v0 J } z6 R, c3 k
FROM work_unit |
|