|
在MySQL查询中,我使用 timediff / time_to_sec 函数计算两个日期时间之间的总分钟数。' d) H' e! y3 g5 ~0 i
例如:* d; T8 s1 t$ X/ O
2010-03-23 10:00:00
' g$ ?7 X F& k4 [: n' K8 ?4 W7 T-. W0 l* |# {6 e) Y ?$ F
2010-03-23 08:00:00
1 p; Z/ I8 O$ [2 k5 J5 @= 120 minutes
$ |/ i8 j* ^ _, ~* V我想做的是排除在选定时间范围内发生的任何休息。
; S0 S9 I3 m' [4 [$ z. s8 W例如:
* K( T V( {6 g4 ^' I2010-03-23 10:00:00
) Z8 N# m8 z. z6 {, G( W-
* S& P5 c$ j) ~; |! ^1 X+ r# B2010-03-23 08:00:00
7 ?. F% X' {$ n( I$ T# L" \-+ P+ Z1 v" G! s5 H
(break 08:55:00 to 09:10:00)8 l- o4 t- i% ?& L3 Y( d% ]
= 105 minutes
+ s" _2 R2 G' H是否有一个好的方法可以做到这一点而无需求助于一长串的嵌套IF语句?( z* y3 b4 W, O- u' ]
UPDATE1:2 i4 e$ [9 [/ w' n
为了澄清-我正在尝试计算用户完成给定任务所需的时间。如果他们喝咖啡休息时间,则需要排除该时间段。茶歇时间为固定时间。
" F9 J' ?4 }, W0 n9 f& I1 S
+ M. Z7 l b3 K( @) o1 e5 _+ b解决方案:
9 Z3 t2 y* B3 } : U' R' [! ?8 [
% M) z4 u/ Z1 @' E2 Z- m. S5 e
$ m: y* C; N1 C$ |# S 将所有您在这段时间内发生的休息时间相加,然后减去timediff / time_to_sec函数的结果
' T4 w# g1 C" P) N# j2 ?SELECT TIME_TO_SEC(TIMEDIFF('17:00:00', '09:00:00')) -- 288000 c! H1 _4 ]9 f% O' I2 I( b7 y8 @
SELECT TIME_TO_SEC(TIMEDIFF('12:30:00', '12:00:00')) -- 1800
1 ?( p$ @5 o% e' j- tSELECT TIME_TO_SEC(TIMEDIFF('10:30:00', '10:15:00')) -- 9005 E4 f# O, w% c* s. \! M
-- 26100
0 v# Q5 j# p; q! n' N) m假设这个结构:! `. c, C/ x: L6 Y2 s
CREATE TABLE work_unit (
+ d/ M( N- l; B- C& W id INT NOT NULL,& ]0 ]2 n8 N5 b t+ n
initial_time TIME," r( x( x, p% ^
final_time TIME
0 ^1 X/ M1 Z% E; N4 J! _( j4 ])
7 q4 f0 F1 ^' ]& U) u$ ~CREATE TABLE break (
; v3 z, u o; H3 d9 o% J id INT NOT NULL,2 B( @* R4 f. q0 |
initial_time TIME,
3 k% ]. H4 [! v: P. ~ final_time TIME8 A* J1 ~! k7 j: W# R5 L5 s* C7 d! Z
)
1 R4 v) d0 V z1 _9 W# wINSERT work_unit VALUES (1, '09:00:00', '17:00:00')5 I. v9 a: Y2 y& E! s5 D4 \
INSERT break VALUES (1, '10:00:00', '10:15:00')
* Y, M8 x( n$ J5 w0 B5 ] r) f' mINSERT break VALUES (2, '12:00:00', '12:30:00')
n i/ X N. z# _9 ?" B2 L您可以使用下一个查询来计算它:
- L6 V) v5 T8 M. ISELECT *, TIME_TO_SEC(TIMEDIFF(final_time, initial_time)) total_time# g% C; K4 S! v9 y
, (SELECT SUM(
5 @5 g& _9 V6 F6 G+ T9 v TIME_TO_SEC(TIMEDIFF(b.final_time, b.initial_time)))
n& g/ X4 |7 M: K FROM break b
% k) H: L: ^' _' Y+ @$ ?& c 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)
$ x2 `! {& D" j% s9 v9 h ) breaks
# }; F m0 `6 S m" |4 u- U& eFROM work_unit |
|