37

我需要正确的语法给我:

  1. 上一周的星期一日期基于当前日期/时间,使用GETDATE()
  2. 前一周的周日日期基于当前日期/时间,使用GETDATE()

因此,根据今天的日期(2012 年 9 月 14 日),我想要以下内容:

  1. 上周一的日期 = 03/09/2012
  2. 上周日的日期 = 09/09/2012
4

6 回答 6

63

简单的:

--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)
于 2012-09-14T12:42:11.897 回答
16

除了使用 case 选项,您还可以这样做来获取本周的星期日:

SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1+1, GETDATE())

要获得前一周的星期日,再减去 7 天:

SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1-6, GETDATE())
于 2015-06-15T15:38:53.640 回答
6

上周一:

SELECT DATEADD(DD,-(DATEPART(WEEKDAY, GETDATE())+5)%7, GETDATE())

上周日:

SELECT DATEADD(DD,-(DATEPART(WEEKDAY, GETDATE())+6)%7, GETDATE())
于 2019-04-16T15:30:30.483 回答
5

更好的是,我认为,这适用于任何日期,任何工作日,任何 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
于 2016-06-22T10:23:24.087 回答
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
于 2016-05-04T08:53:25.790 回答
3

应该注意的是,至少从 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)

对我尝试过的任何日期(包括星期天)返回相同的值。

于 2017-04-20T09:44:26.623 回答