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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取2周前的周日和周六的日期相关的知识,希望对你有一定的参考价值。

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

我需要从两周前得到星期六和星期日的日期(所以今天是12月23/24。

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

谢谢

答案

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

SELECT DATEADD(wk, -2, DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6))
另一答案

试试这个(星期六)和星期天一样:

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参数的weekday返回当天的名称,因此如果您在星期一,则必须减去15天才能到达星期六,依此类推。

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

SET LANGUAGE us_english

你可以看到SqlFiddle

另一答案

由于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()))
另一答案

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

例如:

set datefirst 1

select convert(date,dateadd(d, -15-datepart(dw, getdate()), getdate())), 
   convert(date,dateadd(d, -14-datepart(dw, getdate()), getdate()))
另一答案

对不起,我会为这些工作提供一般表格;这是快速而肮脏的。我喜欢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 ;  

以上是关于获取2周前的周日和周六的日期的主要内容,如果未能解决你的问题,请参考以下文章

获取当月周六周日日期

本月周六周日LIST集合

如何重置周日晚上 11:59(周一开始前的时间)从数据库中获取的记录

C#如何获取上周六日期

presto - 获取最近一个星期六的日期

php获取本周开始日期和结束日期的方法