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
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.
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)
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).
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
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))
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)
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.