2010-01-14 46 views

回答

7

您可以将您的日期转换为周数和比较这对从当前日期的周数。同样,你也需要比较一年,所以你不会得到去年的周。

WHERE DATEPART(wk, [Order].SubmittedDate) = DATEPART(wk, GETDATE()) 
AND DATEPART(yy, [Order].SubmittedDate) = DATEPART(yy, GETDATE()) 
+2

请注意,您可能会注意到性能问题,因为这是一个不可优化的条件,因此无法使用最佳索引。请参阅http://www.sql-server-performance.com/tips/t_sql_where_p2.aspx – AdaTheDev 2010-01-14 11:54:07

+0

+1好的提示。它看起来可能更简单,但它不一定是好的表现。 – 2010-01-14 11:54:49

+0

你有办法让这个表现更快吗? – Andy 2010-01-14 11:57:47

0

试试这个:

WHERE [Order].SubmittedDate BETWEEN 
     DATEADD(d, - DATEPART(dw, GETDATE()) + 1, GETDATE()) AND 
     DATEADD(d, 7 - DATEPART(dw, GETDATE()) , GETDATE()) 

也许这可以跑得更快,因为并不需要进行评估每次:

DECLARE @StartDate DATETIME, 
     @EndDate  DATETIME 
SELECT @StartDate = DATEADD(d, - DATEPART(dw, GETDATE()) + 1, GETDATE()), 
     @EndDate = DATEADD(d, 8 - DATEPART(dw, GETDATE()) , GETDATE()) 

-- // Strip time part, so week starts on Sunday 00:00 
SELECT @StartDate = CAST(FLOOR(CAST(@StartDate AS FLOAT)) AS DATETIME), 
     @EndDate = CAST(FLOOR(CAST(@EndDate AS FLOAT)) AS DATETIME) 
... 
WHERE [Order].SubmittedDate >= @StartDate AND [Order].SubmittedDate < @EndDate 
+0

技术上你可能会错过使用这个机会的记录(渺茫的机会) - 在最后一秒创建的记录如何(例如23:59:59.500)?因此,我总是更喜欢使用> = .... AND <....方法使用第二天的00:00:00作为<结束日期 – AdaTheDev 2010-01-14 12:07:05

+0

,因此可以减去一个毫秒=)我得到了你的点数 – 2010-01-14 12:08:38

+0

它是因为我已经看到了实际上在野外产生了不正确结果的情况,并且在试图找到值得注意的问题时很容易忽视。 – AdaTheDev 2010-01-14 12:11:55

1

假设你总是意思是 “这一周” 和在将来没有提交日期的记录,我想可能是您可以这样做的情况:

WHERE [Order].SubmittedDate >= DATEADD(dd, -(DATEPART(dw, GETDATE()) -1), GETDATE()) 

如果日期干什么去到未来,充分限制本周是:

WHERE [Order].SubmittedDate >= DATEADD(dd, -(DATEPART(dw, GETDATE()) -1), GETDATE()) 
    AND [Order].SubmittedDate < CAST(CONVERT(VARCHAR(10), DATEADD(dd, (8 - DATEPART(dw, GETDATE())), GETDATE()), 120) AS DATETIME) 

我强烈推荐使用基于开始和结束日期这样的条款,因为这将使高效索引使用应该更好。

相关问题