我目前正试图获得任何一年的第一天和最后一天。我有1950年的数据,我希望数据集中的一年中的第一天到达数据集中一年的最后一天(请注意,一年中的最后一天可能不是12月31日,与第一天相同这一年。
最初我认为我可以使用CTE
并在年份选择日期调用DATEPART
,但这不会适当地进行分区。我也试过CTE
自我加入,但由于一年的最后一天或第一天可能会有所不同,这也会产生不准确的结果。
例如,使用下面的内容实际上会在MIN
中生成一些MAX
,反之亦然,但理论上它应该只抓住年份的MAX
日期和{{ 1}}年份的日期:
MIN
答案 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