2009-11-23 3 views
2

J'ai une table qui ressemble à ceci:DATEDIFF SQL sur les dates non contiguës

Code Mark Date Notional 
Beta 5/1/2008 $1,102,451.00 
Beta 5/2/2008 $1,102,451.00 
Beta 5/5/2008 $1,102,451.00 
Beta 5/6/2008 $1,102,451.00 

Je dois créer une table qui a tout de la marque des dates dans une colonne et la différence entre chaque marque adjacente Date de tri dans une autre colonne C'est le SQL que j'ai écrit:

SELECT 
    Current.[Mark Date], 
    Prev.[Mark Date], 
    (DATEDIFF("d", Prev.[Mark Date], Current.[Mark Date])/365) 

FROM Notional as Prev, Notional as Current 
WHERE (Prev.[Mark Date] = (Current.[Mark Date]-1)); 

Cependant, cette SQL ne sera pas rejoindre le week-end 5/5/2008 -> 5/2/2008 par exemple, ou le week-end long. Comment pourrais-je obtenir que la table se joigne à elle pour des dates non contiguës? Merci pour votre aide!

+0

Je suis juste curieux à ce sujet. Y a-t-il à la fois une table nommée Notional et un champ appelé Notional? Aussi, que voulez-vous dire quand vous dites "ce SQL ne rejoindra pas?". Pouvez-vous donner un exemple? – PowerUser

+0

Pouvez-vous pas utiliser une instruction CASE le jour de la semaine pour rejoindre un lundi à un vendredi mare à lun weds to tues etc etc – AntDC

Répondre

1

La seule façon de le faire est d'utiliser ROW_NUMBER (et ROW_NUMBER + 1) sur une sélection ordonnée par date pour un SQL qui prend en charge les numéros de ligne ou pour créer un table temporaire avec une clé d'incrémentation automatique que vous remplissez dans l'ordre chronologique.

Il n'y a pas d'autre moyen sans recourir à une solution non-jointure (qui est une boucle.)

+0

Ok oui, je dois créer une table temporaire avec la clé d'incrémentation automatique parce que j'utilise ACCESS 2007 ... une idée sur la façon de faire cela? –

+0

pas du haut de ma tête - Je crois en l'accès que vous utilisez le mot-clé auto lorsque vous déclarez la table. assurez-vous que si vous créez une table temporaire, vous ne placez pas tous les champs dans la table temporaire - mieux vaut juste une table temporaire avec deux champs - autoinckey et clé externe (la clé externe pointe vers la touche de la table Notion). Ce sera plus rapide. – Hogan

+0

Ce n'est pas vrai. Cela peut être fait sans utiliser de boucles. S'il vous plaît voir ma réponse pour une brève description –

1

Vous pouvez essayer d'utiliser ROW_NUMBER lors de la sélection et de vous joindre à cet ordre avant la date.

EDIT. Fait avec des jointures.

Ce que vous pouvez faire est de joindre la table à elle-même, à des dates plus grandes que cette ligne, puis de grouper par et sélectionnez le min.

Quelque chose comme ça

DECLARE @Table TABLE(
     DateVal DATETIME 
) 

INSERT INTO @Table SELECT '01 May 2009' 
INSERT INTO @Table SELECT '02 May 2009' 
INSERT INTO @Table SELECT '05 May 2009' 
INSERT INTO @Table SELECT '06 May 2009' 

SELECT t.DateVal, 
     MIN(tNext.DateVal) NextDate 
FROM @Table t LEFT JOIN 
     @Table tNext ON t.DateVal < tNext.DateVal 
GROUP BY t.DateVal 

Je sais ce code est Sql Server, mais peut facilement être modifiée pour MS Access.

Cela devrait retourner le folowing:

StartDate     EndDate 
2009-05-01 00:00:00.000 2009-05-02 00:00:00.000 
2009-05-02 00:00:00.000 2009-05-05 00:00:00.000 
2009-05-05 00:00:00.000 2009-05-06 00:00:00.000 
2009-05-06 00:00:00.000 NULL 
+0

Est-ce considéré comme une bonne forme? –

Questions connexes