如何使用SQL Server与当前一周进行比较?

如何使用SQL Server与当前一周进行比较?,sql,sql-server,tsql,Sql,Sql Server,Tsql,如何将SQL Server日期列与当前周进行比较 例如: WHERE [Order].SubmittedDate = *THIS WEEK* 您可以将日期转换为周数,并将其与当前日期的周数进行比较。同样,你也需要比较一年,这样你就不会得到去年的几周 WHERE DATEPART(wk, [Order].SubmittedDate) = DATEPART(wk, GETDATE()) AND DATEPART(yy, [Order].SubmittedDate) = DATEPART(yy, G

如何将SQL Server日期列与当前周进行比较

例如:

WHERE [Order].SubmittedDate = *THIS WEEK*

您可以将日期转换为周数,并将其与当前日期的周数进行比较。同样,你也需要比较一年,这样你就不会得到去年的几周

WHERE DATEPART(wk, [Order].SubmittedDate) = DATEPART(wk, GETDATE())
AND DATEPART(yy, [Order].SubmittedDate) = DATEPART(yy, GETDATE())
试试这个:

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
DECLARE@StartDate DATETIME,
@结束日期日期时间
选择@StartDate=DATEADD(d,-DATEPART(dw,GETDATE())+1,GETDATE()),
@EndDate=DATEADD(d,8-DATEPART(dw,GETDATE()),GETDATE())
--//脱衣舞时间部分,因此本周从周日00:00开始
选择@StartDate=CAST(FLOOR(CAST(@StartDate作为FLOAT))作为日期时间),
@EndDate=CAST(FLOOR(CAST(@EndDate作为FLOAT))作为DATETIME)
...
其中[Order]。SubmittedDate>=@StartDate和[Order]。SubmittedDate<@EndDate

假设您的意思始终是“本周”,并且将来没有包含提交日期的记录,我想您可以这样做:

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)
其中[Order].SubmittedDate>=DATEADD(dd,-(DATEPART(dw,GETDATE())-1),GETDATE())
和[Order].SubmittedDate

我强烈建议使用一个基于这样的开始和结束日期的子句,因为它将允许有效的索引使用,因此性能应该更好。

[Order]。在@StartOfThisWeek和@EndOfThisWeek之间提交数据。
请注意,您可能会注意到性能受到影响,因为这是一个不可接受的条件,因此会阻止最佳索引使用。请参阅+1好提示。它可能看起来更简单,但不一定表现得很好。你有办法让它表现得更快吗?@Andy-是的,看我的答案。基本上,不要在函数调用中包装要查询的字段。相反,你要计算出你感兴趣的时期的开始和结束日期,并用该日期范围进行查询。我建议用上述方法谨慎行事。例如,尝试将getdate替换为2015年12月30日至2016年1月2日之间的日期。这里有一个逻辑错误。从技术上讲,你可以使用这个(很小的机会)错过记录-那么在最后一秒创建的记录(例如23:59:59.500)呢?因此我总是喜欢使用>=。。。。这是因为我见过这样的例子,在野外,这实际上产生了不正确的结果,在试图找到问题时很容易被忽视,因此值得注意。