我目前正在尝试获取任何一年的第一天和最后一天。 我有 1950 年的数据,我想获取数据集中该年的第一天到该数据集中该年的最后一天(请注意,该年的最后一天可能不是 12 月 31 日,与 12 月 31 日相同)年)。
最初我以为我可以使用
CTE
并通过选择一年中的某一天来调用 DATEPART
,但这不会正确分区。 我还尝试了 CTE
自连接,但由于一年中的最后一天或第一天可能不同,这也会产生不准确的结果。
例如,使用下面的代码实际上会在
MIN
中生成一些 MAX
,反之亦然,尽管理论上它应该只获取当年的 MAX
日期和当年的 MIN
日期:
;WITH CT AS(
SELECT Points
, Date
, DATEPART(DY,Date) DA
FROM Table
WHERE DATEPART(DY,Date) BETWEEN 363 AND 366
OR DATEPART(DY,Date) BETWEEN 1 AND 3
)
SELECT MIN(c.Date) MinYear
, MAX(c.Date) MaxYear
FROM CT c
GROUP BY YEAR(c.Date)
您希望在一年的第一天有这样的事情:
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)
try this
用于获取第一天、今年的最后一天以及明年的第一天
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)
我应该避免在晚上开发,因为我解决了它,而且实际上很简单:
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
DECLARE @Year int = 2024
SELECT
FirstDay = CONVERT(date, LTRIM(@Year))
, LastDay = DATEADD(DAY, -1, CONVERT(date, LTRIM(@Year+1)))
;