我有一个存储过程,每晚都会生成一个报告。此SP引用一个视图,该视图拍摄2周前(周日至周六)的数据快照。
我需要从两周前得到星期六和星期日的日期(因此今天将是12月23日至24日。
我已经搜索了很多解决方案,但我无法找到一个合适的回答 - 任何一个能够帮助解答并解释一点这样做的原因(似乎有一千种方法)。
由于
答案 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 ;