2014-07-17 29 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 

关于如何在SELECT中包含2个日期之间的区别的任何想法?在SELECT中使用DATEDIFF

我想能够使用值StartDate和EndDate但是我收到一个错误,说StartDate和EndDate是无效的列。

+1

如果这些值是有序的,为什么不使用'min()'和'max()'? –

回答

0

你不能使用你同样SELECT子句中的其他地方SELECT子句中创建别名,所以你需要在DATEDIFF()函数内把你的FIRST_VALUE()LAST_VALUE()功能:

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 

或者你可以运行一切但DATEDIFF()在子查询/ 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 

你也不能使用在SELECT克劳斯创建别名e在WHERE子句中,但您可以在ORDER BY中使用它们,当然也可以在任何外部查询中使用它们。

0

作为一个说明,我想你的查询等效于:

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; 

功能MIN()MAX()更简洁。此外,查询更容易阅读为group by而不是select distinct