web-dev-qa-db-fra.com

Comment obtenir la liste des dates entre deux dates dans la requête de sélection mysql

Je veux que la liste des dates se situe entre deux dates en sélectionnant la requête. Par exemple:

Si je donne '2012-02-10' et '2012-02-15' j'ai besoin du résultat.

date      
----------
2012-02-10
2012-02-11
2012-02-12
2012-02-13
2012-02-14
2012-02-15 

Comment puis-je avoir?

34
Sangeetha Krishnan

Essayer:

select * from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date from
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where selected_date between '2012-02-10' and '2012-02-15'

-à ce jour s'étend sur près de 300 ans dans le futur.

[Corrigé après une modification suggérée par UrvishAtSynapse.]

100
user359040
set @i = -1;
SELECT DATE(ADDDATE('2012-02-10', INTERVAL @i:=@i+1 DAY)) AS date FROM `table`
HAVING 
@i < DATEDIFF('2012-02-15', '2012-02-10') 

Cela retournera votre jeu de résultats exactement comme prescrit. Cette requête nécessite uniquement que vous changiez les deux dates différentes en dateiff et adddate.

21
hexparrot

La réponse acceptée n'a pas fonctionné pour moi dans MySQL 5.5. J'ai mis à jour la requête pour qu'elle fonctionne pour moi:

select * from 
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
 (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where selected_date between '2012-02-10' and '2012-02-15'
10
NateTallman

Vous pouvez créer un tableau contenant toutes les dates que vous pourriez avoir besoin d'utiliser:

date
2000-01-01
2000-01-02
2000-01-03
...etc..
2100-12-30
2100-12-31

Recherchez ensuite cette table comme suit:

SELECT date
FROM dates
WHERE date BETWEEN '2012-02-10' AND '2012-02-15'
2
Mark Byers

Jetez un oeil à ce post: Obtenez une liste de dates entre deux dates

Vérifiez la procédure stockée que Ron Savage a fait, cela semble correspondre à ce dont vous avez besoin!

1
Nugget