Overlappende datums controleren
Sommige programeer-problemen zijn lastiger dan andere. Een wat ik altijd tricky heb gevonden (tot voor kort) is het uitzoeken of 2 tijdspannes overlappen. Dit is niet zo evident omdat een begindatum voor, gelijk met of na de 2e begindatum kan liggen, alsook de einddatum. Denk eerst even na hoe jij een oplossing zou implementeren..
..
..
Dit is de mijne (in MySQL):
explain events;
# +-------+------+------+-----+---------+-------+
# | Field | Type | Null | Key | Default | Extra |
# +-------+------+------+-----+---------+-------+
# | start | date | YES | | NULL | |
# | end | date | YES | | NULL | |
# +-------+------+------+-----+---------+-------+
# 2 rows in set (0.00 sec)
select * from events WHERE datediff('2008-01-15', end) <= 0 AND datediff('2008-02-01', start) >= 0;
Waar 2008-01-15 de begindatum is, en 2008-02-01 de einddatum. En ik krijg een resultset van alle overlappende datums. Even als voorbeeld:
mysql> select * from events WHERE datediff('2008-01-15', end) <= 0 AND datediff('2008-02-09', start) >= 0;
+------------+------------+
| start | end |
+------------+------------+
| 2008-01-01 | 2008-02-01 |
+------------+------------+
mysql> select * from a WHERE datediff('2007-12-05', end) <= 0 AND datediff('2008-02-09', start) >= 0;
+------------+------------+
| start | end |
+------------+------------+
| 2008-01-01 | 2008-02-01 |
+------------+------------+
mysql> select * from a WHERE datediff('2008-02-05', end) <= 0 AND datediff('2008-02-09', start) >= 0;
Empty set (0.00 sec)
EDIT: En na even te keuvelen met bernard zijn we ook op TIMEDIFF gekomen.. Handig!!
Comments
-
I've always been intrigued by solving this problem in a spatial domain. Every distinct moment in time is nothing more than a point on a line. Which makes most of the timediff and overlapping calculations pretty easy. (enough spatial support to cover this is topic is included since mysql v5+)