19 votes

Requête SQL NOT entre deux dates

J'ai besoin d'aide pour une requête SQL.

J'essaie de sélectionner tous les enregistrements de la table test_table qui ne pourrait pas s'insérer entre les deux dates "2009-12-15" et "2010-01-02".

Voici la structure de ma table :

`start_date` date NOT NULL default '0000-00-00',
`end_date` date NOT NULL default '0000-00-00'

-----------------------------
 **The following record should not be selected:**

`start_date`, `end_date`
'2003-06-04', '2010-01-01'

Ma question :

SELECT * 

FROM `test_table` 
WHERE 

CAST('2009-12-15' AS DATE) NOT BETWEEN start_date and end_date 
AND 
CAST('2010-01-02' AS DATE) NOT BETWEEN start_date and end_date

Une idée de la raison pour laquelle ma requête sélectionne des enregistrements erronés ? Devrais-je changer l'ordre des valeurs dans la requête pour quelque chose comme :

start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)

Merci beaucoup pour toute aide

28voto

Ward Points 1846

Et si vous essayiez :

select * from 'test_table'
where end_date < CAST('2009-12-15' AS DATE)
or start_date > CAST('2010-01-02' AS DATE)

qui renverra toutes les plages de dates qui ne chevauchent pas du tout votre plage de dates.

9voto

Dereleased Points 6187

Votre logique est à l'envers.

SELECT 
    *
FROM 
    `test_table`
WHERE
        start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)
    AND end_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)

3voto

Tony Andrews Points 67363

Voulez-vous dire que la plage de dates des lignes sélectionnées ne doit pas être entièrement comprise dans la plage de dates spécifiée ? Dans ce cas :

select *
from test_table
where start_date < date '2009-12-15'
or end_date > date '2010-01-02';

(La syntaxe ci-dessus est pour Oracle, la vôtre peut être légèrement différente).

3voto

brandonstrong Points 341

Si le "NOT" est placé avant la date de début, cela devrait fonctionner. Pour une raison quelconque (je ne sais pas pourquoi), lorsque 'NOT' est placé avant 'BETWEEN', tout semble être retourné.

NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))

1voto

Johannes Rudolph Points 19845

Ce que vous faites actuellement, c'est vérifier si ni la date de début ni la date de fin ne sont comprises dans l'intervalle des dates indiquées.

Je suppose que ce que vous cherchez vraiment, c'est un disque qui ne soit pas adapter dans la fourchette de dates indiquée. Si c'est le cas, utilisez la requête ci-dessous.

SELECT * 
    FROM `test_table` 
    WHERE  CAST('2009-12-15' AS DATE) > start_date  AND  CAST('2010-01-02' AS DATE) < end_date

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X