0
votes

Quelle pourrait être la meilleure approche pour créer une requête pour sélectionner "à partir de la date", "à ce jour" dans une liste des dates de colonne unique?

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()


2 commentaires

Vous supposez que le bail 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 ()".


3 Réponses :


1
votes

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


0 commentaires

1
votes

Je crée une table avec nom Q1 pour votre problème avec cette structure xxx

et inséré vos données et écrit ci-dessous la requête, je pense que c'est correct xxx

Cette requête génère votre sortie exactement


0 commentaires

2
votes

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


1 commentaires

Nice ... 10 sur 8K a raté. Merci!