SQL

时间:2017-10-04 20:01:51

标签: sql sql-server-2012

我想在本周前一周前的最后5周。今天是2017年10月4日,所以我希望日期范围在8月21日至9月24日之间。这是我正在使用的代码,但由于某种原因它不起作用:

DATEADD(week, -5, GETDATE()) and DATEADD(week, -1, GETDATE())

我也试过DATEADD(week, -6, GETDATE()) and DATEADD(week, -2, GETDATE())但没有发生变化,太奇怪了。

任何人都可以帮助我。这是SQL 2012中的SQL查询。

WHERE hire_date between DATEADD(week, -6, GETDATE()) and DATEADD(week, -2, GETDATE())

3 个答案:

答案 0 :(得分:4)

分别查看每个表达式。使用Management Studio(或类似)运行此:

SELECT DATEADD(week, -1, GETDATE())

你会看到类似的东西(相对于你运行它的时间):

2017-09-27 15:05:39.453

就在一周前,那仍然是星期三。你想要星期天,那个星期的开始。所以现在这样做:

SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()) -1, 0)

这会给你这个结果:

2017-09-25 00:00:00.000

更紧密。它的工作方式是花费第0天并添加一个小于自目标日期一周以来经过的周数。你整整几个星期都在增加,所以你最终会有一个可预测的整周开始。你得到的是25日(星期一)而不是24日,因为第0天(1900年1月1日)碰巧是星期一。但它可以可靠地一个星期一,现在很容易再考虑一天:

SELECT DATEADD(DAY, -1, DATEADD(week, DATEDIFF(week, 0, GETDATE()) -1, 0))

现在我们有一个可以使用的日期,从一个能够始终如一的表达式开始:

2017-09-24 00:00:00.000

排序。如果在星期日或星期一运行,您需要仔细测试它的行为,特别是当Sql Server具有可配置的星期开始值时。您可能会发现自己越过了一个比预期更少或更长的周边界,并最终出现了奇怪的逐个错误。但即使发生这种情况,这种方法也会让你走上你需要走的路。

另一方面,只需更改周数:

SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()) -6, 0)

要得到这个:

2017-08-21 00:00:00.000

由于问题是星期一而不是星期日,我们可以跳过之前的额外DATEADD()

现在把它们放在一起就像这样:

WHERE hire_date between 
           DATEADD(week, DATEDIFF(week, 0, GETDATE()) -6, 0) 
        AND 
           DATEADD(DAY, -1, DATEADD(week, DATEDIFF(week, 0, GETDATE()) -1, 0))

答案 1 :(得分:0)

DATEADD(week, -5, GETDATE())减少30天。你将不得不做一些手动DATEADD来把它带到一周的开头,这听起来像是你想要的。

DECLARE @date datetime = GETDATE()
DECLARE @dw nvarchar = DATENAME(dw, @date)
IF @dw = 'Monday' SET @date = DATEADD(day, -1, @date)
ELSE IF @dw = 'Tuesday' SET @date = DATEADD(day, -2, @date)
....
WHERE hire_date between DATEADD(week, -6, @date) and DATEADD(week, -2, @date)

这样,您可以自己设置一周的开头,而不必依赖系统文化。

答案 2 :(得分:0)

根据您的说法,我认为您需要从最早的一周的第一天到最近一周的最后一天。为此,您可以这样做:

WHERE hire_date between DATEADD(week, -6, DATEADD(WEEK, DATEDIFF(wk,0,GETDATE()), 0)) 
and DATEADD(week, -2, DATEADD(WEEK, DATEDIFF(wk,5,GETDATE()), 6))