如何使用TSQL获取一年中的最后一个星期日?

如何使用TSQL获取一年中的最后一个星期日?,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我需要检查给定的一天是否是任何一年的最后一个星期日,如果是,只使用TSQL返回1 我对TSQL不太了解。SQL Server在工作日有问题,因为它们可能会受到国际化设置的影响。假设为默认值,您可以执行以下操作: select dateadd(day, 1 - datepart(weekday, datefromparts(@year, 12, 31)), datefromparts(@year, 12, 31)

我需要检查给定的一天是否是任何一年的最后一个星期日,如果是,只使用TSQL返回1


我对TSQL不太了解。

SQL Server在工作日有问题,因为它们可能会受到国际化设置的影响。假设为默认值,您可以执行以下操作:

select dateadd(day,
               1 - datepart(weekday, datefromparts(@year, 12, 31)),
               datefromparts(@year, 12, 31)
              )
否则,您需要执行一个
case
表达式来将一周中的某一天转换为一个数字

在较旧版本的SQL Server中,您可以执行以下操作:

select dateadd(day,
               1 - datepart(weekday, cast(@year + '0101' as date)),
               cast(@year + '0101' as date)
              )

我没有专门使用过tsql,但如果我的sql知识和谷歌搜索足够好,那么像这样的东西应该可以做到:

... WHERE DATEPART(dw, date) = 7 and DATEDIFF (d, date, DATEFROMPARTS (DATEPART(yyyy, date), 12, 31)) <= 6

。。。其中DATEPART(dw,date)=7和DATEDIFF(d,date,DATEFROMPARTS(DATEPART(yyyy,date),12,31))使用Gordon先生的查询,在IIF()之后如果给定的日期是一年中的最后一个星期日,则返回1;如果不是,则返回0

使用2018作为年份,使用2018-12-30作为给定日期。可以用变量替换值

select IIF( DATEDIFF(DAY,'2018-12-30',
              DATEADD(day,
              1 - datepart(weekday, datefromparts(2018, 12, 31)),
              datefromparts(2018, 12, 31)
                   )) = 0, 1, 0)

你可以使用这个功能

功能代码:

    create FUNCTION CheckIsSaturday 
(
    @date DATETIME
)
RETURNS int
AS
BEGIN
    -- Declare the return variable here
    DECLARE @result INT
    DECLARE @DayOfWeek NVARCHAR(22)
    DECLARE @LastDayOfYear DATETIME
    select @LastDayOfYear=DATEADD(yy, DATEDIFF(yy, 0, @date) + 1, -1)
    SELECT @DayOfWeek=DATENAME(dw, @date)
    IF(@DayOfWeek='Saturday' AND DATEDIFF(dd,@date,@LastDayOfYear)<7)
        RETURN 1;
    RETURN 0; 

END
GO

如果您有一个


您还可以使用此功能获取一年中的每一天:

;WITH getlastdaysofyear ( LastDay, DayCnt ) AS ( 
   SELECT   DATEADD(dd, -DAY(DATEADD(mm, 1,  DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1))),
            DATEADD(mm, 1,  DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1))),
            0 AS DayCnt
   UNION ALL
   SELECT   LastDay,
   DayCnt + 1
   FROM     getlastdaysofyear
)
   SELECT  *
        FROM ( SELECT TOP 7 DATEADD(DD, -DayCnt, LastDay) LastDate,
                      'Last ' + DATENAME(Weekday,DATEADD(DD, -DayCnt, LastDay)) AS DayStatus
   FROM      getlastdaysofyear ) T

ORDER BY DATEPART(Weekday, LastDate)

希望您喜欢:)

我将年份声明为int,然后尝试上面的查询,结果显示无法构造数据类型date,一些参数的值无效@gordon在这里似乎可以正常工作。什么版本的SQL Server?很好的简单解决方案。可能与
DECLARE @CheckDate DATE = '20181230'

;WITH cteGetDates AS 
(
    SELECT
         [Date], WeekDayName, WeekOfMonth, [MonthName], [Year]
        ,LastDOWInMonth = ROW_NUMBER() OVER 
        (
            PARTITION BY FirstDayOfMonth, [Weekday] 
            ORDER BY [Date] DESC
        )
    FROM
        dbo.DateDimension
)
SELECT * FROM cteGetDates D
WHERE D.LastDOWInMonth = 1 AND D.WeekDayName = 'Sunday' and D.MonthName = 'December' AND D.[Date] = @CheckDate
;WITH getlastdaysofyear ( LastDay, DayCnt ) AS ( 
   SELECT   DATEADD(dd, -DAY(DATEADD(mm, 1,  DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1))),
            DATEADD(mm, 1,  DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1))),
            0 AS DayCnt
   UNION ALL
   SELECT   LastDay,
   DayCnt + 1
   FROM     getlastdaysofyear
)
   SELECT  *
        FROM ( SELECT TOP 7 DATEADD(DD, -DayCnt, LastDay) LastDate,
                      'Last ' + DATENAME(Weekday,DATEADD(DD, -DayCnt, LastDay)) AS DayStatus
   FROM      getlastdaysofyear ) T

ORDER BY DATEPART(Weekday, LastDate)