~vieri_pl rozwiązanie w PHP kompletnie mnie nie interesuje.
Kod
SELECT * FROM `TIME`;
+---------------------+---------------------+
| FROM | TO |
+---------------------+---------------------+
| 2012-04-25 21:00:00 | 2012-04-25 07:00:00 |
| 2012-04-25 23:00:00 | 2012-04-25 07:00:00 |
| 2012-04-25 21:00:00 | 2012-04-25 05:00:00 |
| 2012-04-25 23:00:00 | 2012-04-25 05:00:00 |
| 2012-04-25 07:00:00 | 2012-04-25 19:00:00 |
| 2012-04-26 00:00:00 | 2012-04-26 06:00:00 |
+---------------------+---------------------+
SELECT `FROM`, `TO`, SEC_TO_TIME( ( IF( `FROM` > `TO`, 1, 0 ) * IF( LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24, 16 / 24 ) < 0, 0, LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24,16 / 24 ) ) + GREATEST( 0, LEAST( 22 / 24, ( TIME( `TO` ) / 24 / 10000 ) + IF( `FROM` > `TO`, 1, 0 ) ) - GREATEST( 6 / 24, ( TIME( `FROM` ) / 24 / 10000 ) ) ) ) * 24 * 3600 ) AS `DAY`, SEC_TO_TIME( MOD( TIMEDIFF( TIME( `TO` ), TIME( `FROM` )) / 24 / 10000 + IF( SIGN( TIMEDIFF( TIME( `TO` ), TIME( `FROM` )) / 24 / 10000 ), 1, 0 ), 1 ) * 24 * 3600 - ( ( IF( `FROM` > `TO`, 1, 0 ) * IF( LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24, 16 / 24 ) < 0, 0, LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24,16 / 24 ) ) + GREATEST( 0, LEAST( 22 / 24, ( TIME( `TO` ) / 24 / 10000 ) + IF( `FROM` > `TO`, 1, 0 ) ) - GREATEST( 6 / 24, ( TIME( `FROM` ) / 24 / 10000 ) ) ) ) * 24 * 3600 ) ) AS `NIGHT` FROM `TIME`
Kod
+---------------------+---------------------+----------+----------+
| FROM | TO | DAY | NIGHT |
+---------------------+---------------------+----------+----------+
| 2012-04-25 21:00:00 | 2012-04-25 07:00:00 | 02:00:00 | 08:00:00 |
| 2012-04-25 23:00:00 | 2012-04-25 07:00:00 | 01:00:00 | 07:00:00 |
| 2012-04-25 21:00:00 | 2012-04-25 05:00:00 | 01:00:00 | 07:00:00 |
| 2012-04-25 23:00:00 | 2012-04-25 05:00:00 | 00:00:00 | 06:00:00 |
| 2012-04-25 07:00:00 | 2012-04-25 19:00:00 | 12:00:00 | 00:00:00 |
| 2012-04-26 00:00:00 | 2012-04-26 06:00:00 | 00:00:00 | 06:00:00 |
+---------------------+---------------------+----------+----------+
6 rows in set (0.00 sec)
Przesadziłem, ale działa.