我想在本周前一周前的最后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())
答案 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))