获得任何一年的第一天和最后一天

时间:2013-11-19 03:24:54

标签: tsql sql-server-2012

我目前正试图获得任何一年的第一天和最后一天。我有1950年的数据,我希望数据集中的一年中的第一天到达数据集中一年的最后一天(请注意,一年中的最后一天可能不是12月31日,与第一天相同这一年。

最初我认为我可以使用CTE并在年份选择日期调用DATEPART,但这不会适当地进行分区。我也试过CTE自我加入,但由于一年的最后一天或第一天可能会有所不同,这也会产生不准确的结果。

例如,使用下面的内容实际上会在MIN中生成一些MAX,反之亦然,但理论上它应该只抓住年份的MAX日期和{{ 1}}年份的日期:

MIN

3 个答案:

答案 0 :(得分:2)

一年的第一天你想要这样的东西:

dateadd(year, datediff(year,0, c.Date), 0)

这是今年的最后一天:

--first day of next year -1
dateadd(day, -1, dateadd(year, datediff(year,0, c.Date) + 1, 0)

答案 1 :(得分:1)

try this

获得第一天,一年中的最后一天&&首先是next_year

SELECT
   DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) AS Start_Of_Year,
 dateadd(yy, datediff(yy,-1, getdate()), -1) AS Last_Day_Of_Year,
   DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, 0) AS FirstOf_the_NextYear

所以把它放在你的查询中

;WITH CT AS(
    SELECT Points
        , Date
        , DATEPART(DY,Date) DA
    FROM Table

WHERE DATEPART(DY,Date) BETWEEN 
DATEPART(day,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) AND  
DATEPART(day,dateadd(yy, datediff(yy,-1, getdate()), -1))
)

SELECT MIN(c.Date) MinYear
    , MAX(c.Date) MaxYear
FROM CT c
GROUP BY YEAR(c.Date)

答案 2 :(得分:0)

我应该避免在晚上发展,因为我解决了它,它实际上非常简单:

SELECT MIN(Date)
    , MAX(Date)
FROM Table
GROUP BY YEAR(Date)

我可以在日期中将这些值放入CTE然后JOIN并获得我需要的内容:

;WITH CT AS(
    SELECT MIN(Date) Mi
        , MAX(Date) Ma
    FROM Table
    GROUP BY YEAR(Date)
)
SELECT c.Mi
    , m.Points
    , c.Ma
    , f.Points
FROM CT c
    INNER JOIN Table m ON c.Mi = m.Date
    INNER JOIN Table f ON c.Ma = f.Date