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

问题描述 投票:0回答:4

我目前正在尝试获取任何一年的第一天和最后一天。 我有 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)
t-sql sql-server-2012
4个回答
5
投票

您希望在一年的第一天有这样的事情:

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)

3
投票

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)

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

0
投票
DECLARE @Year int = 2024
SELECT 
        FirstDay    = CONVERT(date, LTRIM(@Year))
    ,   LastDay     = DATEADD(DAY, -1, CONVERT(date, LTRIM(@Year+1)))
;
© www.soinside.com 2019 - 2024. All rights reserved.