2009-12-18 4 views
1

J'ai une table qui définit les intervalles de temps.Requête pour sélectionner des intervalles dans une table

_______________________________ 
| id | description | start_date | 
|____|_____________|____________| 
| 1 | First  | NULL | 
| 3 | Third  | 2009-12-18 | 
| 5 | Second  | 2009-10-02 | 
| 4 | Last  | 2009-12-31 | 
|____|_____________|____________| 

Il ne stocke que la date de début, la date de fin est un jour avant la date suivante qui suit.

Je voudrais avoir le résultat suivant:

____________________________________________ 
| id | description | start_date | end_date | 
|____|_____________|____________|____________| 
| 1 | First  | NULL | 2009-10-01 | 
| 5 | Second  | 2009-10-02 | 2009-12-17 | 
| 3 | Third  | 2009-12-18 | 2009-12-30 | 
| 4 | Last  | 2009-12-31 | NULL | 
|____|_____________|____________|____________| 

Comment devrais-je écrire cette requête, car une ligne contient des valeurs d'autres lignes?

(je pense que la fonction MySQL DATE_SUB pourrait être utile.)

Répondre

2
SELECT d.id, d.description, MIN(d.start_date), MIN(d2.start_date) - INTERVAL 1 
DAY AS end_date 
FROM start_dates d 
LEFT OUTER JOIN start_dates d2 ON (d2.start_date > d.start_date OR d.start_date IS NULL) 
GROUP BY d.id, d.description 
ORDER BY d.start_date ASC 
+0

retourne les lignes en double –

+0

Quelles lignes dupliquées obtenez-vous? Plus d'une ligne pour un identifiant? Le GROUP BY devrait éviter cela ... –

+0

Désolé, j'avais tort. Ça marche. Merci beaucoup. –

0

si vous utilisez PHP, simplement calculer la date précédente dans le script. c'est plus facile.

sinon, serait quelque chose comme:

SELECT ID,description,start_date,start_date-1 AS end_date FROM ... 

travail?

MISE À JOUR: cela fonctionne partiellement, car il retourne 20091224 pour startdate 2009-12-25 mais ne fonctionnera pas pour les dates comme 2009-12-01 etc.

0

essayer

Select d.Id, d.Description, d.Start_Date, 
     n.Start_Date - 1 EndDate 
    From Table d 
    Left Join Table n 
     On n.Start_Date = 
       (Select Min(Start_date) 
       From Table 
       Where Start_Date > Coalesce(d.Start_Date, '1/1/1900') 
+0

ne fonctionne pas: il retourne trop de lignes –

+0

ce lignes supplémentaires est de le renvoyer. Si vos données sont telles que décrites ci-dessus, elles doivent renvoyer une ligne par ligne dans votre tableau. –

+0

La première ligne a 'NULL' pour' start_date' et 'end_date' –

2

essayer

select id, description, start_date, end_date from 
    (
    select @rownum_start:[email protected]_start+1 rank, id, description, start_date 
    from inter, (select @rownum_start:=0) p 
    order by start_date 
) start_dates 
left join 
    (
    select @rownum_end:[email protected]_end+1 rank, start_date - interval 1 day as end_date 
    from inter, (select @rownum_end:=0) p 
    where start_date is not null 
    order by start_date 
) end_dates 
using (rank) 

inter est votre table

Cela renvoie en fait:

mysql> select id, description, start_date, end_date from ... 
+----+-------------+------------+------------+ 
| id | description | start_date | end_date | 
+----+-------------+------------+------------+ 
| 1 | First  | NULL  | 2009-10-01 | 
| 5 | Second  | 2009-10-02 | 2009-12-17 | 
| 3 | Third  | 2009-12-18 | 2009-12-30 | 
| 4 | Last  | 2009-12-31 | NULL  | 
+----+-------------+------------+------------+ 
4 rows in set (0.00 sec) 
+0

(+ 1) Merci, ça fonctionne. Cependant, j'ai accepté la solution de Peter Lang, parce que c'est plus simple. –

+0

Oui, si j'avais le choix, je préfèrerais aussi la solution de Peter :-) –

Questions connexes