Query Mysql per determinare se il dato datetime è incluso nell'intervallo datetime

Sono bloccato su questa attività in cui se il dato data / ora cade tra la data di inizio e di fine. Ad esempio, ecco una tabella di dati del calendario:

| id | start | end | 31 | 2017-03-15 05:21:30 | 2017-03-15 06:21:30 | 32 | 2017-03-14 06:25:30 | 2017-03-14 06:25:30 | 33 | 2017-03-14 06:25:45 | 2017-03-14 06:25:45 

E devo inserire nuovi dati nella tabella con i seguenti dati di inizio e fine:

start: 2017-03-15 05:30:30 end: 2017-03-15 06:30:30

Ma prima devo controllare se la data di inizio e di fine è esistente in qualsiasi intervallo datetime nella mia tabella.

Il risultato dovrebbe essere che le date di inizio e di fine specificate non verranno inserite perché cade o è inclusa nell'intervallo datetime id 31 della tabella.

Come dovrei essere in grado di farlo usando una query? Ho provato questo tipo di query: Select * from calendar_date as c where c.start >= start AND c.end <= end per determinare che il dato data e ora di inizio e di fine esiste ma nessun risultato trovato e penso di aver incasinato la query . Spero davvero che qualcuno possa aiutarmi a verificarlo.

Ecco qui:

 Select * from calendar_date as ,c where LEAST(c.end, end) - GREATEST(c.start, start) > 0 

Se stai verificando se un intervallo di tempo si sovrappone a un altro, il trucco è controllare se ci sono delle righe con le seguenti condizioni:

 @end > t1.start AND @start < t1.end 

Qui @start e @start rappresentano l'inizio e la fine della window temporale che sto confrontando con il tavolo.

Questo è mentalmente doloroso each volta che lo guardo perché è controintuitivamente semplice.

Se la window temporale in questione termina dopo l'inizio e l' inizio di una window esistente prima della fine della windoe esistente, allora c'è necessariamente una sovrapposizione.

La prova della logica si trova nelle condizioni che fanno sì che l'espressione sopra sia falsa: se il confronto viene valutato come falso, l'espressione combinata è falsa:

Se la nuova window non termina dopo l'avvio di una window stabilita, termina necessariamente prima dell'avvio della window stabilita e quindi non si sovrappone. (Condizione 1, @end > t1.start ).

Se la nuova window non si avvia prima che una window stabilita termini, allora inizia necessariamente dopo la fine della window stabilita, e quindi non si sovrappone (Condizione 2, @start < t1.end ).

Come scritto, questa query non corrisponde a windows che si toccano con precisione – una window che inizia esattamente alla fine di un'altra o che termina esattamente all'inizio di un'altra – è consentita. Se non vuoi questo, usa >= e <= .

Per bloccare un inserto, è necessario un trigger BEFORE INSERT .

 DELIMITER $$ DROP TRIGGER IF EXISTS calendar_date_bi $$ CREATE TRIGGER calendar_date_bi BEFORE INSERT ON calendar_date FOR EACH ROW BEGIN IF EXISTS(SELECT * FROM calendar_date cd WHERE NEW.end > cd.start AND NEW.start < cd.end) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'overlapping date ranges are not allowed'; END IF; END $$ DELIMITER ;