2010-12-15 42 views
0

j'ai une tableTrouvez différence entre les dates de fin en comparant les lignes

---------- 
User 
---------- 
userID(pk) 
startdate // update : i am not using this field. 
enddate 

je dois comparer entre les end_dates entre les lignes comparant si elle est plus de 3 jours et compter le userid.

je suis en train de faire quelque chose de similaire à ce

WHILE @@FETCH_STATUS = 0 
BEGIN 

    select @lastrowID = max(rowid) from @User 
    if (@userid = (select userId from @User where rowid = @lastRowID)) 
    begin 
     update @User set NextEndDate= @endDate where rowid = @lastRowID and userid = @userid 
    end 
    else 
    begin 
     insert @UserTable (userid, EndDate,NextEndDate) values (@userid, @endDate,@NextEndDate) 
    end 
END 

mon idée est de boucle autour de la table et créer une date de nextend puis trouver le comparer à l'aide datediff. Je suis coincé avec la première partie de la création de la prochaine date et je crois que la deuxième partie de la comparaison serait facile. Je suis coincé entre les deux.

Ma question est que je fais la bonne chose, c'est assez compliqué. Je suis confus si pour obtenir le résultat à travers la requête sql ou utilisez C# au code derrière en utilisant Linq ou quelque chose de similaire.

Mise à jour: désolé si je n'étais pas clair dans l'explication de mon scénario: je suis en train de trouver le comte, pas de fois un client a visité. ex: id_utilisateur: 1 peut être visité quotidiennement ou une fois par mois. donc j'ai besoin d'obtenir le compte (fréquence de la visite de l'utilisateur). donc si les utilisateurs ont visité la date de fin a été

userid  enddate 
1   1/1/2010 
1   1/2/2010 count 1 
1   1/10/2010 count 2 difference is more than 3 days 
1   1/13/2010 count 2 (because diff is less than 3 days) 

thats comment je devrais compter, thats y j'ai essayé d'utiliser le curseur qui était trop pour moi compliquerait à résoudre. J'apprécie pour vos conseils.

+0

Quelle version du serveur sql? – Donnie

+0

Je ne vous vois pas compter n'importe où dans cette boucle de curseur. Pouvez-vous expliquer en termes clairs ce que vous essayez d'obtenir? Il pourrait très bien y avoir un moyen de le faire sans un curseur. – cdonner

+0

Version SQL Server 2008. @cdonner Je suis coincé dans la première partie de la création d'un nextenddate afin que je puisse comparer avec le nextenddate et enddate dans la même rangée. Si je reçois ce résultat correctement, la prochaine partie je compterais en comparant mais je ne veux vraiment pas utiliser le curseur. Est-ce qu'il y a un autre moyen. Merci. – jero

Répondre

1

Ok, je comprends votre problème maintenant. Je sais qu'il existe une meilleure façon de faire cela en SQL, peut-être avec des CTE, mais cette solution devrait fonctionner et n'utiliser pas de curseurs. Cela vous donnera un tableau complet avec le datediff de la date de fin précédente (le cas échéant). Vous pouvez ensuite en choisir un sur la base du datediff.

select u1.*, datediff(day, u2.enddate, u1.enddate) as days from 
    (
    select userid, enddate, row_number() over(partition by userid order by userid, enddate) as rownumber 
    from [user] 
    ) u1 
    left join 
    (
    select userid, enddate, row_number() over(partition by userid order by userid, enddate) as rownumber 
    from [user] 
    )u2 
    on u1.userid = u2.userid 
    and u1.rownumber = u2.rownumber + 1 
+0

merci jlnorsworthy, j'ai mis à jour ma question en expliquant mon scénario. J'ai besoin de calculer pour chaque ligne et ne pas prendre les min et max pour l'utilisateur spécifique. – jero

+0

Ok, je l'ai maintenant ... il peut certainement être fait en SQL, je vais devoir sortir mon livre de recettes SQL :) (un gourou sql pourrait répondre facilement si) – jlnorsworthy

+0

ur homme génial ... merci. – jero

0

EDIT

declare @table table (userid int, startdate datetime, enddate datetime) 

insert into @table (userid, startdate, enddate) values (1, '01-JAN-2010', '2-JAN-2010') 
insert into @table (userid, startdate, enddate) values (2, '01-JAN-2010', '3-JAN-2010') 
insert into @table (userid, startdate, enddate) values (3, '01-JAN-2010', '4-JAN-2010') 
insert into @table (userid, startdate, enddate) values (4, '01-JAN-2010', '5-JAN-2010') 
insert into @table (userid, startdate, enddate) values (5, '01-JAN-2010', '6-JAN-2010') 
insert into @table (userid, startdate, enddate) values (6, '01-JAN-2010', '7-JAN-2010') 
insert into @table (userid, startdate, enddate) values (7, '01-JAN-2010', '8-JAN-2010') 

select SUM(yn) as dueinmorethanthreedays from 
    (select 
    (case when DATEADD(day,3,startdate) < enddate then 1 else 0 end) as yn 
    from @table 
) as derived 

Une sous-requête qui renvoie une pour chaque ligne où la startdate est inférieure à trois jours qui suivent la date de fin (et 0 sinon) peuvent être additionnés pour obtenir le total.

+0

merci amelvin mais je n'utilise pas startdate, j'ai besoin de comparer entre les dates de fin de chaque ligne pour l'identifiant de l'utilisateur spécifique. – jero