|
|
1
3
更新:
|
|
|
2
2
在一个查询中有点棘手,但是这个查询应该可以工作: --------------
SELECT source, correct, hours_to_end, (source + INTERVAL hours_to_end HOUR) ending
FROM (
SELECT source, correct
, LEAST(hours, hours_to_off)
+ (((hours_left - MOD(hours_left, on_long)) / on_long) * 24
+ off_long
+ MOD(hours_left, on_long)) * overlap hours_to_end
FROM (
SELECT source, correct, hours, on_long, off_long, hours_to_off
, GREATEST(0, hours - hours_to_off) hours_left
, IF(hours - hours_to_off >= 0, 1, 0) overlap
FROM (
SELECT source, correct, hours, off_long
, (24 - off_long) on_long
, HOUR(TIMEDIFF(DATE(source) + INTERVAL off_start HOUR, source)) hours_to_off
FROM tt
) t
) t
) t
--------------
+---------------------+---------------------+--------------+---------------------+
| source | correct | hours_to_end | ending |
+---------------------+---------------------+--------------+---------------------+
| 2010-11-11 12:00:00 | 2010-11-11 13:00:00 | 1.0000 | 2010-11-11 13:00:00 |
| 2010-11-11 19:00:00 | 2010-11-12 06:00:00 | 11.0000 | 2010-11-12 06:00:00 |
| 2010-11-11 19:00:00 | 2010-11-12 07:00:00 | 12.0000 | 2010-11-12 07:00:00 |
| 2010-11-11 19:00:00 | 2010-11-12 08:00:00 | 13.0000 | 2010-11-12 08:00:00 |
| 2010-11-11 19:00:00 | 2010-11-13 15:00:00 | 44.0000 | 2010-11-13 15:00:00 |
| 2010-11-11 19:00:00 | 2010-11-15 11:00:00 | 88.0000 | 2010-11-15 11:00:00 |
| 2010-11-11 19:00:00 | 2010-11-17 07:00:00 | 132.0000 | 2010-11-17 07:00:00 |
+---------------------+---------------------+--------------+---------------------+
编辑 :以下是较短版本: SELECT source, correct
, source
+ INTERVAL LEAST(hours, hours_to_off)
+ IF(hours-hours_to_off >= 0
,(hours-hours_to_off-MOD(hours-hours_to_off, on_long))/on_long*24
+ off_long + MOD(hours-hours_to_off, on_long)
,0) HOUR ending
FROM (
SELECT source, correct, hours, off_long, (24-off_long) on_long
, HOUR(TIMEDIFF(DATE(source)+INTERVAL off_start HOUR, source)) hours_to_off
FROM tt
) t
;
|
|
|
3
1
这是我的:
|