获取2周前的周日和周六的日期

时间:2018-01-08 13:59:02

标签: sql sql-server sql-server-2008

我有一个存储过程,每晚都会生成一个报告。此SP引用一个视图,该视图拍摄2周前(周日至周六)的数据快照。

我需要从两周前得到星期六和星期日的日期(因此今天将是12月23日至24日。

我已经搜索了很多解决方案,但我无法找到一个合适的回答 - 任何一个能够帮助解答并解释一点这样做的原因(似乎有一千种方法)。

由于

5 个答案:

答案 0 :(得分:4)

以下是任何人将来需要的答案。

SELECT DATEADD(wk, -2, DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6))

答案 1 :(得分:1)

尝试这个(星期六)对于星期日是相同的:

class HasMethod {
    method() {
        alert('Method');
    }
}

class Test extends HasMethod {
    constructor() {
        super();
        this.method();
    }
}

const test = new Test();
带有DECLARE @today datetime SET @today = GETDATE() SELECT CASE WHEN DATENAME(weekday, @today) = 'Monday' THEN DATEADD(day, -15, @today) WHEN DATENAME(weekday, @today) = 'Tuesday' THEN DATEADD(day, -16, @today) WHEN DATENAME(weekday, @today) = 'Wednesday' THEN DATEADD(day, -17, @today) WHEN DATENAME(weekday, @today) = 'Thursday' THEN DATEADD(day, -18, @today) WHEN DATENAME(weekday, @today) = 'Friday' THEN DATEADD(day, -19, @today) WHEN DATENAME(weekday, @today) = 'Saturday' THEN DATEADD(day, -13, @today) WHEN DATENAME(weekday, @today) = 'Sunday' THEN DATEADD(day, -14, @today) END 参数的

DATENAME会返回当天的名称,因此,如果您在星期一,则必须减去15天才能到达星期六,依此类推。

注意:如果您设置了其他语言,则可以使用以下方法更改查询:

weekday

您可以看到SqlFiddle

答案 2 :(得分:0)

由于day of week值在不同的机器上可能不同,您需要使用set datefirst 1命令将其设置为Podiluska的答案中的建议,
或者你可以先确定星期日的实际价值并将其加到你减去的日子 要确定星期日的实际价值,只需询问知情星期日的价值,例如2018-01-07

以下示例应返回2017-12-23 / 2017-12-24
如果你在星期五,星期四,或者其他任何一天运行它,它也会返回...

-- this will contain are test date
declare @date date = getdate() - 2

-- determine the number for sunday
declare @Sunday int = (select datepart(dw, '20180107'))

select convert(date,dateadd(d, -15 - datepart(dw, @date) + (datepart(dw, @date) - @Sunday), getdate())), 
       convert(date,dateadd(d, -14 - datepart(dw, @date) + (datepart(dw, @date) - @Sunday), getdate()))

答案 3 :(得分:-1)

这取决于你如何定义一周开始的时间,但基本原则是找到本周的开始,然后带走14天。

例如:

set datefirst 1

select convert(date,dateadd(d, -15-datepart(dw, getdate()), getdate())), 
   convert(date,dateadd(d, -14-datepart(dw, getdate()), getdate()))

答案 4 :(得分:-1)

对不起,我将针对这些使用通用格式;这是快速而肮脏的。 我喜欢NEXT_DAY函数。简单,而且显而易见。

    declare  
  vFromDate date :=  trunc( sysdate ) - 9 ; -- '27 Feb 2019'  
  vSatDate  date ;  
  vSunDate  date ;  
begin  
  -- test a range of dates  
  while vFromDate <= sysdate -- '3 Mar 2019'  
  loop  
    select NEXT_DAY ( TRUNC ( vFromDate) - 21, 'SAT')    -- 7: general form for these?  
    -- keep or discard the " - 1" depending on if the 2 wk Sunday is the desired Sunday  
         , NEXT_DAY ( TRUNC ( vFromDate) - 20 - 1, 'SUN') -- 1:  
         into vSatDate, vSunDate  
         from dual ;  
    dbms_output.put_line( to_char( vFromDate, 'dd Mon": "' )   
                        || to_char( vSatDate, 'dd Mon' )   
                        || to_char( vSunDate, '", "dd Mon' )  
                        );  
    vFromDate := vFromDate + 1 ;  
  end loop ;  
  dbms_output.put_line( rpad('*', 21, '*' ) );  
end ;