2014-07-17 2 views
1
SELECT DISTINCT 
    Test, 
    FIRST_VALUE (CONVERT(DATE, datetime)) OVER (ORDER BY datetime DESC) StartDate, 
    LAST_VALUE (CONVERT(DATE, datetime)) OVER (ORDER BY datetime DESC) EndDate, 
    DATEDIFF(MONTH, StartDate, EndDate) 
FROM 
    Tests 

Des idées sur la façon dont je peux inclure la différence entre les 2 dates dans le SELECT?Utilisation de DATEDIFF dans un SELECT

Je veux être en mesure d'utiliser les valeurs StartDate et EndDate, mais je reçois une erreur indiquant que StartDate et EndDate sont des colonnes non valides.

+1

Si les valeurs sont dans l'ordre, pourquoi ne pas utiliser 'min()' et 'max()'? –

Répondre

0

Vous ne pouvez pas utiliser les alias créés dans la clause SELECT ailleurs dans le même SELECT article, vous devez donc placer vos FIRST_VALUE() et LAST_VALUE() fonctions au sein de la fonction DATEDIFF():

SELECT DISTINCT 
    Test, 
    FIRST_VALUE (CONVERT(DATE, datetime)) OVER (ORDER BY datetime DESC) StartDate, 
    LAST_VALUE (CONVERT(DATE, datetime)) OVER (ORDER BY datetime DESC) EndDate, 
    DATEDIFF(MONTH, FIRST_VALUE (CONVERT(DATE, datetime)) OVER (ORDER BY datetime DESC) 
        , LAST_VALUE (CONVERT(DATE, datetime)) OVER (ORDER BY datetime DESC)) 
FROM 
    Tests 

Ou vous pouvez exécuter tout mais le DATEDIFF() dans un sous-requête/cte:

SELECT *,DATEDIFF(MONTH, StartDate, EndDate) 
FROM (SELECT DISTINCT 
     Test, 
     FIRST_VALUE (CONVERT(DATE, datetime)) OVER (ORDER BY datetime DESC) StartDate, 
     LAST_VALUE (CONVERT(DATE, datetime)) OVER (ORDER BY datetime DESC) EndDate 
     FROM 
     Tests 
    ) AS sub 

Vous pouvez également pas utiliser les alias créés dans le SELECT claus e dans la clause WHERE, mais vous pouvez les utiliser dans ORDER BY et bien sûr dans toutes les requêtes externes.

0

Comme note, je pense que votre requête est équivalente à:

SELECT Test, 
     CONVERT(DATE, MIN(datetime)) as StartDate, 
     CONVERT(DATE, MAX(datetime) as EndDate, 
     DATEDIFF(MONTH, CONVERT(DATE, MIN(datetime)), CONVERT(DATE, MAX(datetime))) 
FROM Tests 
GROUP BY Test; 

Les fonctions MIN() et MAX() sont plus succincte. En outre, la requête est plus facile à lire en tant que group by plutôt qu'en tant que select distinct.