2017-08-25 5 views
0

J'ai une liste de plages de dates et j'aime obtenir une liste de tous les mois qui sont dans ces plages de dates. Je peux interroger mes plages de dates comme ceci:Liste des mois dans plusieurs périodes dans mysql

Select id, start, end 
From date_range 

Et cette requête donne la sortie suivante:

1, 01-01-2016, 25-03-2016 
2, 26-03-2016, 30-03-2016 
3, 30-12-2016, 08-01-2017 

Maintenant, je voudrais trouver une requête MySQL qui répertorie seulement tous les mois au sein de ces plages de dates . Donc, il devrait donner les résultats suivants:

01-2016 
02-2016 
03-2016 
12-2016 
01-2017 

Il existe déjà des exemples ici sur la façon d'obtenir une liste de mois entre deux dates, telles que:

Mais ces exemples concernent environ une seule plage de dates, mais j'ai plusieurs plages de dates. Ce serait génial si quelqu'un peut trouver une requête sql pour mon problème.

+0

Votre question est un peu déroutant. Voulez-vous tous les mois dans les plages de dates, ou simplement le mois/année de chaque date de début/fin dans les plages? –

+0

@Sloan: Je veux tous les mois dans les plages de dates. Donc, si une plage de dates s'étend sur 5 mois, alors tous les 5 mois devraient apparaître. –

+1

Ceci est vraiment un problème d'affichage et, comme tel, mieux résolu dans le code d'application – Strawberry

Répondre

0

Voici une solution:

#DROP TABLE IF EXISTS monthTest; 
CREATE TABLE monthTest(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `start` DATETIME, `end`DATETIME); 

INSERT INTO monthTest(`start`, `end`) VALUES 
    ('2016-01-01', '2016-03-25'), 
    ('2016-03-26', '2016-03-30'), 
    ('2016-12-30', '2017-08-01'); 

SELECT A.`start`, A.`end`, DATE_FORMAT(DATE_ADD(A.`start`, INTERVAL B.help_keyword_id MONTH), '%Y%m') FROM 
    monthTest A, 
    mysql.help_keyword B 
WHERE PERIOD_DIFF(DATE_FORMAT(A.`end`, '%Y%m'), DATE_FORMAT(A.`start`, '%Y%m')) >= B.help_keyword_id 
ORDER BY A.id; 

Notez que cette requête dans la deuxième table JOIN a une dépendance que cette table doit contenir plus de lignes que le nombre maximal de mois entre deux dates et le champ de jointure doit soit un INTEGER incrémentant à partir de 0. Cela est dû à la limitation que mysql ne contient pas (encore) de générateur de ligne donc une solution de contournement est nécessaire.

Cordialement,

James