我需要正确的语法给我:
GETDATE()
GETDATE()
所以,基于今天的日期(14/09/2012),我想要以下内容:
答案 0 :(得分:40)
易:
--start of last week
SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0)
--end of last week
SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6)
修改强>:
以下将处理星期日发布日期。
DECLARE @input varchar(10)
--SET @input = '9/9/2012' -- simulates a Sunday
SET @input = GETDATE()
--start of last week
SELECT DATEADD(wk, DATEDIFF(wk, 6,
CASE DATEPART(dw,@input)
WHEN 1 THEN DATEADD(d,-1,@input)
ELSE @input
END
), 0)
--end of last week
SELECT DATEADD(wk, DATEDIFF(wk, 6,
CASE DATEPART(dw,@input)
WHEN 1 THEN DATEADD(d,-1,@input)
ELSE @input
END
), 6)
答案 1 :(得分:10)
除了使用案例选项外,您还可以执行此操作以获取当前周的周日:
SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1+1, GETDATE())
为了获得前一周的周日,再减去7天:
SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1-6, GETDATE())
答案 2 :(得分:4)
更好的是,我认为,这适用于任何日期,任何工作日,任何DateFirst参数(设置一周的第一天,通常是法国的1-Monday,默认为7-Sunday)。
create function [dbo].[previousWeekDayDate](@anyDate date, @anyWeekDay int)
returns Date
as
begin
return DATEADD(dd, ((DATEPART(dw,@anyDate) + @@DateFirst - @anyWeekDay + 13) % 7) * -1, @anyDate)
end
适用于SQL 2008,创建函数并使用:
SELECT dbo.previousWeekDayDate(GetDate(),1) --for Monday
SELECT dbo.previousWeekDayDate(GetDate(),7) --for Sunday
答案 3 :(得分:3)
我认为这是更清洁的解决方案:
SELECT
-- 17530101 or 1753-01-01 is the minimum date in SQL Server
DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE()) / 7) * 7) - 7, '17530101') AS [LowerLimit], -- Last Week's Monday
DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE()) / 7) * 7) - 1, '17530101') AS [UpperLimit] -- Last Week's Sunday.
在现实世界的查询中可以这样使用:
SELECT
*
FROM
SomeTable
WHERE
SomeTable.[Date] >= DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE()) / 7) * 7) - 7, '17530101') AND
SomeTable.[Date] <= DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE()) / 7) * 7) - 1, '17530101')
以下是一些测试:
<强> 1。闰年
当前日期:2016-02-29 00:00:00.000
结果:
LowerLimit UpperLimit
2016-02-22 00:00:00.000 2016-02-28 00:00:00.000
<强> 2。上周是在不同的一年
当前日期:2016-01-06 00:00:00.000
LowerLimit UpperLimit
2015-12-28 00:00:00.000 2016-01-03 00:00:00.000
第3。上个月的下限和当月的上限
当前日期:2016-05-04 00:00:00.000
LowerLimit UpperLimit
2016-04-25 00:00:00.000 2016-05-01 00:00:00.000
<强> 4。当前日期是星期日
当前日期:2016-05-08 00:00:00.000
LowerLimit UpperLimit
2016-04-25 00:00:00.000 2016-05-01 00:00:00.000
答案 4 :(得分:2)
应该注意的是,星期日的问题似乎不再存在,至少从MSSQL 2012开始。这两个简单的解决方案
SELECT DATEADD(wk, DATEDIFF(wk, 6, @input), 0)
和复杂的
SELECT DATEADD(wk, DATEDIFF(wk, 6,
CASE DATEPART(dw,@input)
WHEN 1 THEN DATEADD(d,-1,@input)
ELSE @input
END
), 0)
在我尝试的任何日期(包括星期日)返回相同内容。
答案 5 :(得分:1)
上周一:
SELECT DATEADD(DD,-(DATEPART(WEEKDAY, GETDATE())+5)%7, GETDATE())
上一个星期日:
SELECT DATEADD(DD,-(DATEPART(WEEKDAY, GETDATE())+6)%7, GETDATE())