【问题标题】:How to get Saturday's Date (Or any other weekday's Date)- SQL Server如何获取星期六的日期(或任何其他工作日的日期)- SQL Server
【发布时间】:2011-08-08 12:24:39
【问题描述】:

如何获取星期六的日期。我有今天的约会。

GETDATE()

如何做到这一点。

例如。今天是08-08-2011

我想输出为08-13-2011

【问题讨论】:

    标签: sql sql-server sql-server-2008 datetime date


    【解决方案1】:

    如果你这样调用,这个函数会在下周六返回:

    SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 6)
    

    “6”来自the list of possible values,您可以为DATEFIRST设置。

    您可以通过相应地更改第二个参数来获取一周中的任何其他日期。

    这是函数:

    IF OBJECT_ID('dbo.fn_Get_NextWeekDay') IS NOT NULL 
      DROP FUNCTION dbo.fn_Get_NextWeekDay
    GO
    CREATE FUNCTION dbo.fn_Get_NextWeekDay(
         @aDate   DATETIME
       , @dayofweek      INT
        /*
          @dw - day of the week
          1 - Monday
          2 - Tuesday
          3 - Wednesday
          4 - Thursday
          5 - Friday
          6 - Saturday
          7 - Sunday
        */   
      )
    RETURNS DATETIME 
    AS
    /*
      SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 6)
      SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 1)
    */
    BEGIN
      RETURN 
          DATEADD(day
            , ( @dayofweek + 8 - DATEPART(dw, @aDate) - @@DATEFIRST ) % 7
            , @aDate 
          )  
    END
    GO
    

    [编辑] 这可能是另一种解决方案。这应该适用于任何语言:

    IF OBJECT_ID('dbo.fn_NextWeekDay') IS NOT NULL 
      DROP FUNCTION dbo.fn_NextWeekDay
    GO
    CREATE FUNCTION dbo.fn_NextWeekDay(
         @aDate     DATE
       , @dayofweek NVARCHAR(30)
      )
    RETURNS DATE
    AS
    /*
      SELECT dbo.fn_NextWeekDay('2016-12-14', 'fri')
      SELECT dbo.fn_NextWeekDay('2016-03-15', 'mon')
    */
    BEGIN
      DECLARE @dx INT = 6
      WHILE UPPER(DATENAME(weekday,@aDate)) NOT LIKE UPPER(@dayofweek) + '%'
      BEGIN
    
        SET @aDate = DATEADD(day,1,@aDate)
    
        SET @dx=@dx-1
        if @dx < 0 
        BEGIN
          SET @aDate = NULL 
          BREAK
        END
      END
    
      RETURN @aDate
    
    END
    GO
    

    【讨论】:

    • 这是一个很好的解决方案,但具有不确定性,并且不适用于任何语言。
    • 对于值 dbo.fn_Get_NextWeekDay('2016-12-14', 2) 在某些配置中函数返回 2016-12-13 00:00:00.000
    【解决方案2】:

    使用DATEPART 获取今天的星期几,并将所需星期几的差添加到今天的日期。

    【讨论】:

      【解决方案3】:
      DECLARE @Today date = 'TODAYS-DATE';
      DECLARE @TodayNumber int = DATEPART(dw, @Today) -- Get the day number
      DECLARE @Saturday date = DATEADD(DAY, (6-@TodayNumber)%7, @Today) 
      -- Add the number of days between today and saturday (the 6th day), modulus 7 to stop you adding negative days
      

      希望有帮助!

      【讨论】:

      • 不确定,但我认为如果今天的日期是星期天,这将不起作用。编辑:没关系,结果是 -1%7 产生 -1 而不是我预期的 1。
      【解决方案4】:

      使用日历表(每个日期一行的表):

      SELECT MIN(DateValue) DateValue
      FROM Calendar
      WHERE DateValue >= CURRENT_TIMESTAMP
      AND DayOfWeek = 'Saturday';
      

      【讨论】:

        【解决方案5】:

        另一种方法需要两个步骤,但可能更具可读性(看起来,没有模数):

        1. 回到上周六:DATEADD(DAY, -1 * datepart(weekday, GETDATE()), getdate())
        2. 然后,增加一周:DATEADD(WEEK, 1, @lastSaturday, getdate()))

        整件事:

        declare @today DATETIME = GETDATE()
        declare @lastSaturday DATETIME = DATEADD(DAY, -1 * datepart(weekday, @today), @today)
        declare @nextSaturday DATETIME = DATEADD(WEEK, 1, @lastSaturday)
        

        或者,如果您可以接受 @todayGETDATE(),您可以一次完成所有计算:

        SELECT DATEADD(WEEK, 1, DATEADD(DAY, -1 * datepart(weekday, GETDATE()), getdate()))
        

        【讨论】:

          【解决方案6】:

          检查 SQL DATEADD 函数。

          DATEADD (Transact-SQL)

          您可以将它与 DATEPART 函数一起使用以返回正确的日期。

          DATEPART (Transact-SQL)

          【讨论】:

            【解决方案7】:

            试试这个:

            SET DATEFIRST 7
            DECLARE @d DATETIME
            SET @d = '2011-08-08' --GETDATE()
            
            SELECT NEXT_SAT = DATEADD(day, (7  + @@DATEFIRST - DATEPART(dw, @d)) % 7, @d )
            

            【讨论】:

            • 但是 SET DATEFIRST 7 这不能在 SQL 函数中使用.. 怎么办?
            • 您当前的 SET DATEFIRST 值是多少? (选择@@DATEFIRST)
            • 当前值为 7 。但它可能会从 SYSTEM 更改为 SYSTEM ..right ??
            • 没错,但您通常不会在服务器范围内乱用该值
            • 是的......我得到了解决方案,在调用该函数之前给出这个 `SET DATEFIRST 7' 行......主要来自 SP。 :)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-12
            • 1970-01-01
            相关资源
            最近更新 更多