2010-05-04 15 views
0

C'est mon premier message et je suis vraiment rouillé sur MSSQL donc soyez gentil :-)SQL - L'utilisation de datediff en tant que requête est en cours d'exécution?

J'ai une table dans laquelle j'essaye d'employer du datediff. Je pense que ce sera plus facile si je posterai la requête et ses résultats du premier

select mh.agetime, mh.whatid 

from mailhistory mh 
inner join mail m 
on mh.mailid=m.myid 
where (mh.whatid=17 or mh.whatid=11 or mh.whatid=0) and maincontactid=287816 and mailid=276086 

order by agetime 

Vraiment, le maincontactid et mailid sont actuellement juste là pour limiter les résultats alors que je fais la requête.

Les résultats sont les suivants ...

AGETIME     WHATID 
1899-12-30 00:00:00.000 0 
1899-12-30 00:48:10.000 11 
1899-12-31 02:16:49.000 17 
1899-12-31 06:29:08.000 11 
1900-01-18 15:31:40.000 17 
1900-02-11 14:56:59.000 11 

Je suis en train de faire une troisième colonne que les pistes de requête qui feront une troisième colonne montrant la différence entre les dates (en jours) ... entre les éléments avec un WHATID de 11 et 17 ... donc je suis après de tels résultats:

AGETIME     WHATID DIFFERENCE 
1899-12-30 00:00:00.000 0   NULL 
1899-12-30 00:48:10.000 11  0 
1899-12-31 02:16:49.000 17  1 
1899-12-31 06:29:08.000 11  0 
1900-01-18 15:31:40.000 17  18 
1900-02-11 14:56:59.000 11  22 

Quelque chose comme ça ... alors, est-il un moyen de convertir ma requête pour faire la course comme datediff cette?

Merci beaucoup d'avance!

Chris

Répondre

0

Si vous utilisez SQL Server 2005 ou au-dessus, vous pouvez faire un CTE et affecter row_number à votre resultset en cours. Ensuite, vous pouvez avoir une auto-jointure gauche sur CTE avec Current.Row_Num = Previous.Row_Num -1 et ensuite obtenir la différence de date. Approche sera similaire comme indiqué dans ce lien:

http://www.kodyaz.com/articles/sql-select-previous-and-next-rows-with-current-row-in-tsql.aspx

Pour SQL Server 2000

En supposant qu'il n'y a pas de regroupement dans le jeu de résultat:

Je créerais probablement une variable de table temporaire au lieu de CTE avec une identité déposée (qui agira comme un numéro de base), puis appliquera la même logique que celle décrite ci-dessus pour 2005. Seul changement majeur sera au lieu de CTE nous utiliserons la variable Temp Table et au lieu de rownumber nous utiliserons l'identité en temp table.

+0

Salut, j'aurais dû préciser au préalable, mais cela doit fonctionner sur SQL Server 2000 ainsi que 2005 ... fonctionne bien sur 2005 cependant! Pardon! :-( – Twiss