获取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周前的周日和周六的日期的主要内容,如果未能解决你的问题,请参考以下文章