【问题标题】:How to get the last sunday of the year using TSQL?如何使用 SQL 获取一年中的最后一个星期日?
【发布时间】:2018-10-20 17:36:08
【问题描述】:

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

我对 TSQL 不太了解。

【问题讨论】:

标签: sql sql-server database tsql


【解决方案1】:

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)
              )

【讨论】:

  • 我将年份声明为 int,然后尝试上面的查询,它说无法构造数据类型 date ,某些参数的值无效 @Gordon
  • 这里似乎工作正常。什么版本的 SQL Server?
【解决方案2】:

我没有专门使用 tsql,但如果我的 sql 知识和谷歌搜索足够好,那么这样的事情应该可以解决问题:

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

基本上,我们首先检查那一天是否是星期日,然后是否距离一年中的最后一天不到一周

【讨论】:

  • 不错,简单的解决方案。
【解决方案3】:

使用 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)

【讨论】:

    【解决方案4】:

    你可以使用这个功能

    功能代码:

        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
    

    函数用法:

    SELECT dbo.CheckIsSaturday('2017-12-23')
    

    【讨论】:

      【解决方案5】:

      如果您有 Calendar Table,这将变得非常简单

      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
      

      【讨论】:

        【解决方案6】:

        您也可以使用这个来获取一年中的最后一天:

        ;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)
        

        希望你喜欢 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-06
          • 2014-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多