【问题标题】:How to get last day of last week in sql?如何在sql中获取上周的最后一天?
【发布时间】:2016-10-27 20:09:47
【问题描述】:

如何在sql中获取上周的最后日期?我的意思是使用查询的上周日日期?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    不管实际的 DATEFIRST 设置如何,最后一个星期日都可以这样找到:

    SELECT DATEADD(day,
                   -1 - (DATEPART(weekday, GETDATE()) + @@DATEFIRST - 2) % 7,
                   GETDATE()
                  ) AS LastSunday
    

    GETDATE() 替换为参数@date 以获取特定日期之前的最后一个星期日。

    【讨论】:

    • 哇,当我上周想出那个模数技巧时,我以为我太聪明了,可以在给定日期之后找到下一个星期五。我向您致敬,先生。对于那里的非数学极客,Andriy 使用余数返回自周日以来的天数。我要竖起大拇指!
    【解决方案2】:

    上周日“上周”的结束时间

    SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS LAST_SUNDAY
    

    本周假设周一至周日周格式

    SELECT DATEADD(wk, DATEDIFF(wk, 7, CURRENT_TIMESTAMP), 7) AS START_OF_WEEK
    SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6 + 7) AS END_OF_WEEK
    

    结果

    START_OF_WEEK
    -----------------------
    2011-05-02 00:00:00.000
    
    END_OF_WEEK
    -----------------------
    2011-05-08 00:00:00.000
    

    解释巫术的示例使用此示例将 SQL 更改为所需的每周开始和结束日期

    • 以下示例定位当前一周中的星期几(周日至周六)
    • 如果实际的 END_OF_WEEK 是下周日至周六周,那么您需要 +7 到本周的值。 (参见上面的 END_OF_WEEK 示例。)

    SQL 下

    SELECT DATEADD(wk, DATEDIFF(wk, -2, CURRENT_TIMESTAMP), -2) AS DAY_OF_WEEK /* Saturday */
    SELECT DATEADD(wk, DATEDIFF(wk, -1, CURRENT_TIMESTAMP), -1) AS DAY_OF_WEEK /* Sunday */
    SELECT DATEADD(wk, DATEDIFF(wk, 0, CURRENT_TIMESTAMP), 0) AS DAY_OF_WEEK /* Monday */
    SELECT DATEADD(wk, DATEDIFF(wk, 1, CURRENT_TIMESTAMP), 1) AS DAY_OF_WEEK /* Tuesday */
    SELECT DATEADD(wk, DATEDIFF(wk, 2, CURRENT_TIMESTAMP), 2) AS DAY_OF_WEEK /* Wednesday */
    SELECT DATEADD(wk, DATEDIFF(wk, 3, CURRENT_TIMESTAMP), 3) AS DAY_OF_WEEK /* Thursday */
    SELECT DATEADD(wk, DATEDIFF(wk, 4, CURRENT_TIMESTAMP), 4) AS DAY_OF_WEEK /* Friday */
    SELECT DATEADD(wk, DATEDIFF(wk, 5, CURRENT_TIMESTAMP), 5) AS DAY_OF_WEEK /* Saturday */
    SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS DAY_OF_WEEK /* Sunday */
    SELECT DATEADD(wk, DATEDIFF(wk, 7, CURRENT_TIMESTAMP), 7) AS DAY_OF_WEEK /* Monday */
    SELECT DATEADD(wk, DATEDIFF(wk, 8, CURRENT_TIMESTAMP), 8) AS DAY_OF_WEEK /* Tuesday */
    SELECT DATEADD(wk, DATEDIFF(wk, 9, CURRENT_TIMESTAMP), 9) AS DAY_OF_WEEK /* Wednesday */
    SELECT DATEADD(wk, DATEDIFF(wk, 10, CURRENT_TIMESTAMP), 10) AS DAY_OF_WEEK /* Thursday */
    SELECT DATEADD(wk, DATEDIFF(wk, 11, CURRENT_TIMESTAMP), 11) AS DAY_OF_WEEK /* Friday */
    SELECT DATEADD(wk, DATEDIFF(wk, 12, CURRENT_TIMESTAMP), 12) AS DAY_OF_WEEK /* Saturday */
    etc...
    

    【讨论】:

      【解决方案3】:

      这是一篇关于如何做到这一点的精彩文章:

      http://www.objectreference.net/post/SQL-Find-last-week-date-range.aspx

      您可能想使用@StartOfPrevWeek 变量。

      【讨论】:

        【解决方案4】:
        DECLARE @LastSunday DATETIME 
        
        -- This will get the previous Sunday with time as 23:59:59 
        SELECT @LastSunday = Dateadd(SECOND, -1, Dateadd(WK, Datediff(WK, 6, 
                                                             CURRENT_TIMESTAMP) 
                                                        , 7)) 
        
        SELECT @LastSunday 
        
        -- This gets the monday prior to it and time of 00:00:00 
        SELECT Dateadd(SECOND, 1, Dateadd(DAY, -7, @LastSunday)) 
        -- This will make you time spans between eg, Monday 16/07/2012 00:00:00 through to Sunday 22/07/2012 23:59:59
        -- Then use them in your WHERE clause like this 
        -- SELECT X,Y,Z From SomeTable 
        -- WHERE DateField BETWEEN @PreviousMondayToLastSunday AND @LastSunday 
        

        【讨论】:

          【解决方案5】:

          要获取上一个星期天,或者如果今天是星期天,请试试这个

          DATEADD(day,- (DATEPART(dw,getdate()) + @@DATEFIRST -1) % 7, getdate())
          

          【讨论】:

            【解决方案6】:

            使用合适的日历表,SQL 更加简单明了。没有巫毒。

            select max(cal_date) end_of_last_week
            from calendar
            where (cal_date < current_date and day_of_week = 'Sun');
            
            end_of_last_week
            --
            2011-05-01
            

            【讨论】:

              【解决方案7】:
              SELECT (DATEADD(DAY, ((DATEPART(dw, @Date) - 1) * -1), @Date))
              

              【讨论】:

                【解决方案8】:

                这将使您从给定的日期和时间获得下一个宝贵的星期五

                DECLARE @PREVIOUS int, @dtmStart datetime,@dtmEnd datetime, @NEXT int;
                SET @dtmStart = '12/10/2013';
                SET @dtmEnd = '12/11/2013';
                
                select @PREVIOUS = datepart(dw,@dtmStart)
                 WHILE @PREVIOUS <> 6
                BEGIN 
                    SET @dtmStart = DATEADD(day , -1 ,@dtmStart)
                    SET @PREVIOUS = datepart(dw,@dtmStart)
                  CONTINUE 
                END 
                select @dtmStart
                
                 SELECT @NEXT = DATEPART(dw, @dtmEnd)
                   WHILE @NEXT <> 6
                BEGIN 
                    SET @dtmEnd = DATEADD(day , 1 ,@dtmEnd)
                    SET @NEXT = datepart(dw,@dtmEnd)
                  CONTINUE 
                END 
                select @dtmEnd
                

                【讨论】:

                  【解决方案9】:

                  这是获取上周六日期的代码。此方法与数据库的设置无关。

                  declare @lastSaturday date,
                          @today date,
                          @todayName varchar(20);
                  
                  select  @todayName = datename(weekday, getdate()), @today = getdate();
                  
                  select  
                              case @todayName 
                                  when 'Saturday' then @today
                                  when 'Sunday' then dateadd(day,-1,@today)
                                  when 'Monday' then dateadd(day,-2,@today)
                                  when 'Tuesday' then dateadd(day,-3,@today)
                                  when 'Wednesday' then dateadd(day,-4,@today)
                                  when 'Thursday' then dateadd(day,-5,@today)
                                  when 'Friday' then dateadd(day,-6,@today)
                              end  as LastSaturday;
                  

                  【讨论】:

                    【解决方案10】:
                    SET @EndDate = GETDATE()-DatePart(dw, GETDATE());
                    

                    【讨论】:

                    • 这不会返回正确的日期。现在运行它会返回 4/30,也就是上周六。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-11-17
                    • 2021-07-21
                    • 2022-07-22
                    • 1970-01-01
                    相关资源
                    最近更新 更多