|
在MySQL查询中,我使用 timediff / time_to_sec 函数计算两个日期时间之间的总分钟数。
; P- t/ `* z/ t3 @5 f0 C例如:) e# l# `: O% d9 J+ p/ R0 D+ q$ r& E
2010-03-23 10:00:00; W1 _( N+ v# A; K p; c& O& J, T
-
/ U) Y% |% n: B! Y' w" x2010-03-23 08:00:00
8 G8 |6 F4 ^7 e; l5 C3 _= 120 minutes
. p( I5 m. }# K' p. j我想做的是排除在选定时间范围内发生的任何休息。
; j- W" `+ ^" B E0 x ~4 J" z例如:" n/ G; z9 n% k' c" q" K; O# \
2010-03-23 10:00:00
% d# H# j% P% ~: c4 k1 @6 b. f-
2 D3 N* e* q4 A2 i! P2010-03-23 08:00:00; r! l# i, h3 i/ L% T$ _; u
-! v9 P1 @+ ~, N" h
(break 08:55:00 to 09:10:00)
' \" t- p; q9 g: J1 k: k= 105 minutes6 _* ^, {" H6 n% o; @
是否有一个好的方法可以做到这一点而无需求助于一长串的嵌套IF语句?8 ^1 x( D7 c6 w, F) U% \2 J: Y
UPDATE1:6 e9 Q+ ~& d& ], x
为了澄清-我正在尝试计算用户完成给定任务所需的时间。如果他们喝咖啡休息时间,则需要排除该时间段。茶歇时间为固定时间。& v# _7 t& C' p* S
) c/ Q- E8 i1 C: Q$ b
解决方案:& ?8 P; o0 L6 i" v) w% ~' Q5 T: }
/ Q# d8 B; v3 F/ G5 \
. g. s8 `3 h! W2 I( V0 U5 G# }$ H* j. h4 m, a
将所有您在这段时间内发生的休息时间相加,然后减去timediff / time_to_sec函数的结果
1 l. Q/ m' A y4 mSELECT TIME_TO_SEC(TIMEDIFF('17:00:00', '09:00:00')) -- 28800( Q0 a2 U& b+ x# i; s
SELECT TIME_TO_SEC(TIMEDIFF('12:30:00', '12:00:00')) -- 1800
" O# [, N' x6 RSELECT TIME_TO_SEC(TIMEDIFF('10:30:00', '10:15:00')) -- 900
! [) g! `% Y0 F8 e-- 26100
+ U; z, s, a0 D6 s [1 o假设这个结构:
8 B$ A/ Q' d2 c- A4 MCREATE TABLE work_unit (
9 n; o3 {) ]# {$ Y6 b id INT NOT NULL,5 E a3 ~$ p' {) a
initial_time TIME,
8 S* H7 X# U- v4 T7 z1 B final_time TIME
( r% V4 l" _' D)
3 @6 ~* W7 h) ?5 h/ \+ t; L @$ hCREATE TABLE break (
- I- x3 A, ~' S; b6 {; H id INT NOT NULL,2 w7 S1 R" A2 T+ z7 O" B) O8 j
initial_time TIME,! P, a8 ?3 W1 E M, [5 R3 |7 H
final_time TIME
4 _2 O! C! ]) y" v6 u* }! {. R& j)
2 g6 T# c5 M' h T! C7 qINSERT work_unit VALUES (1, '09:00:00', '17:00:00')
0 A% W& l9 r) u, a5 b2 PINSERT break VALUES (1, '10:00:00', '10:15:00')+ A4 r% |4 ^! O8 M% b: x; j+ u
INSERT break VALUES (2, '12:00:00', '12:30:00')& P; ], t( L% p6 p9 Z
您可以使用下一个查询来计算它:" X& S7 o4 }3 V5 M; ^: E
SELECT *, TIME_TO_SEC(TIMEDIFF(final_time, initial_time)) total_time. [+ T+ Z: S' n0 o! \
, (SELECT SUM(
+ U8 i( W9 y: u" W. ^& B TIME_TO_SEC(TIMEDIFF(b.final_time, b.initial_time)))( r5 G& z6 t( @9 s
FROM break b
% r; r; a9 n% u! ]* }5 [5 t 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)
6 O6 Z4 M1 q7 E1 Y) [" e$ y ) breaks
; z: s3 i/ _6 E+ d7 }FROM work_unit |
|