J'ai une structure de table comme celle-ci
id int checkinttime datetime checkouttime datetime roomid int
J'ai enregistré l'heure d'logging et de caisse dans cette table. Ma question est comment générer un rapport par date qui génère si la pièce occupée ou non dans cette plage de dates comme ceci.
room 3/1/2016 3/2/2016 3/3/2016 6/4/2016 r1 PVVP r2 vppp
où p signifie Occupé, et V signifie vacant. Comment écrire SQL pour cela.?
Merci d'avance.
Une solution consiste à utiliser une requête statique sur les pièces sous forme de colonnes comme celle-ci:
;WITH dates(date) AS ( SELECT @startDate UNION ALL SELECT DATEADD(DAY, 1, date) FROM dates WHERE date < @endDate ), occupied AS ( SELECT date, c.booking_id FROM dates d LEFT JOIN -- You can use `JOIN` only also to remove free dates CheckStatus c ON d.date BETWEEN c.checkin_time AND c.checkout_time ) SELECT date , MIN(CASE WHEN id = 1 THEN 'P' ELSE 'V' END) AS 'r1' , MIN(CASE WHEN id = 2 THEN 'P' ELSE 'V' END) AS 'r2' FROM occupied GROUP BY date;
Le résultat sera comme ceci:
date | r1 | r2 | -----------+----+----+ 2016-03-01 | P | V | 2016-03-02 | V | P | 2016-03-03 | V | P | 2016-03-04 | V | P |