web-dev-qa-db-fra.com

Requête SQL PAS entre deux dates

J'ai besoin d'aide avec SQL Query.

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

Voici ma structure de 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 requête:

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 pourquoi ma requête sélectionne de mauvais enregistrements? Dois-je changer l'ordre des valeurs dans la requête en 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

17
Kelvin

Que diriez-vous d'essayer:

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.

27
Jim Lynn

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)
8
Dereleased

Voulez-vous dire que la plage de dates des lignes sélectionnées ne doit pas être entièrement dans la plage de dates spécifiée? Dans quel 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 différer légèrement).

2
Tony Andrews

Ce que vous faites actuellement est de vérifier si ni la date de début ni la date de fin ne se situent dans la plage des dates indiquées.

Je suppose que ce que vous cherchez vraiment, c'est un enregistrement qui ne fit dans la plage de dates indiquée. Si oui, 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
1
Johannes Rudolph

Si le "NON" est placé avant la date de début, cela devrait fonctionner. Pour une raison quelconque (je ne sais pas pourquoi) quand "NON" est mis avant "ENTRE", il semble tout retourner.

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

En supposant que start_date est antérieure à end_date,

interval [start_date..end_date] NOT BETWEEN two dates signifie simplement que cela commence avant le 2009-12-15 ou qu'il se termine après le 2010-01-02.

Ensuite, vous pouvez simplement faire

start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)
0
yu_sha

Pour qu'il y ait un chevauchement, la date de début de la table doit être inférieure à la date de fin de l'intervalle (c'est-à-dire qu'elle doit commencer avant la fin de l'intervalle) ET la date de fin de la table doit être PLUS GRANDE QUE la date de début de l'intervalle. Vous devrez peut-être utiliser <= et> = selon vos besoins.

0
Jim Garrison