Je dois trouver la date de début de la date et la date de fin de chaque voiture louée, mais seulement une seule colonne de suivi de la bail. La logique à suivre est que la date de début d'un bail marque la date de fin de la précédente. La dernière entrée aura à terme la date de fin de la date du système actuelle (getDate)
-Merci, p>
p>
plate leaseNumber leaseStartDate abc01 1 1/1/2000 abc01 2 1/20/2010 abc01 3 3/15/2010 xyz02 4 1/1/2000 xyz02 5 2/20/2000 **expected result:** plate lease fromDate toDate abc01 1 1/1/2000 1/19/2010 abc01 2 1/20/2010 3/14/2010 abc01 3 3/15/2010 getdate() xyz02 4 1/1/2000 2/19/2000 xyz02 5 2/20/2000 getdate()
3 Réponses :
Vous pouvez utiliser LEAD () code> Fenêtre pour obtenir la date "suivante" de la ligne. Soustrayez un jour et c'est le TODATE ;
with
your_data as
(
select plate = 'abc01', leaseNumber = 1, leaseStartDate = convert(date, '2000-01-01') union all
select plate = 'abc01', leaseNumber = 2, leaseStartDate = '2010-01-20' union all
select plate = 'abc01', leaseNumber = 3, leaseStartDate = '2010-03-15' union all
select plate = 'xyz02', leaseNumber = 4, leaseStartDate = '2000-01-01' union all
select plate = 'xyz02', leaseNumber = 5, leaseStartDate = '2000-02-20'
)
select plate,
lease = leaseNumber,
fromDate = leaseStartDate,
toDate = coalesce(dateadd(day, -1, lead(leaseStartDate) over (partition by plate
order by leaseStartDate)),
getdate())
from your_data
order by lease
Je crée une table avec nom Q1 pour votre problème avec cette structure et inséré vos données et écrit ci-dessous la requête, je pense que c'est correct p> Cette requête génère votre sortie exactement p> p>
Vous pouvez utiliser lead () code>, mais vous n'avez pas besoin coalesce () code>. Lead () code> prend trois arguments. Le troisième est la valeur par défaut s'il n'y a pas de ligne suivante. Donc: lead(dateadd(day, -1, leaseStartDate), 1,
getdate()
) over (partition by plate
order by leaseStartDate
) as toDate
Nice ... 10 sur 8K a raté. Merci!
Vous supposez que le bail code> commence immédiatement un nouveau quand on s'est terminé?
Correct. Si c'est le dernier: max (date de début) ... Cela signifie que cela va toujours (courant), d'où la partie "getDate ()".