3

MS SQL DateDiff 函数在计算两个日期之间的差异时计算跨越的边界数。

对我来说不幸的是,这不是我所追求的。例如,2012 年 6 月 1 日 -> 2012 年 6 月 30 日跨越 4 个边界,但涵盖 5 周。

有没有可以运行的替代查询,它会给我一个月相交的周数?

更新

试图澄清我所追求的:

对于任何给定的月份,我需要与该月相交的周数。

此外,对于仅采用 datediff 并添加一个的建议,这是行不通的。例如,2010 年 2 月仅与 4 周相交。并且DateDiff调用返回 4,这意味着简单地添加 1 会使我错误的周数。

4

2 回答 2

4

当心:正确的周计算通常比您想象的要复杂!

如果您使用Datepart(week, aDate)“周”这个概念,您会做出很多假设。一周是从周日还是周一开始?您如何处理第 1 周和第 5 周之间的过渡。一年中的实际周数取决于您使用的周计算规则(first4dayweek、weekOfJan1 等)

如果您只是想处理差异,您可以使用

DATEDIFF('s', firstDateTime, secondDateTime) > (7 * 86400 * numberOfWeeks)

如果第一个 dateTime 是在,2011-01-01 15:43:22那么差异是 5 周后2011-02-05 15:43:22

编辑:实际上,根据这篇文章:Wrong week number using DATEPART in SQL Server 您现在可以用来Datepart(isoww, aDate)获取 ISO 8601 周数。我知道那week是坏的,但不知道现在有修复。凉爽的!

如果您将星期一用作一周的第一天,则此方法有效

 set language = british
 select datepart(ww, @endofMonthDate) - 
        datepart(ww, @startofMonthDate) + 1 
  1. Datepart 是语言敏感的。通过为british您设置语言,使星期一成为一周的第一天。
  2. 这将返回 2010 年 2 月和 2012 年 6 月的正确值!(因为星期一而不是星期日是一周的第一天)。
  3. 它似乎也返回了 1 月和 12 月的正确周数(无论年份如何)。该isoww参数使用星期一作为一周的第一天,但​​它会导致 1 月有时在 52/53 周开始,而 12 月有时在第 1 周结束(这会使您的选择语句更复杂)
于 2011-04-07T13:39:05.737 回答
1

在计算周数时, SET DATEFIRST很重要。要检查您拥有的内容,您可以使用select @@datefirst。@@datefirst=7 表示一周的第一天是星期日。

set datefirst 7

declare @FromDate datetime = '20100201'
declare @ToDate datetime = '20100228'

select datepart(week, @ToDate) - datepart(week, @FromDate) + 1

结果为 5,因为星期日 28/2 - 2010 是第五周的第一天。

如果您想根据一周的第一天是星期一来计算周数,则需要改为这样做。

set datefirst 1

declare @FromDate datetime = '20100201'
declare @ToDate datetime = '20100228'

select datepart(week, @ToDate) - datepart(week, @FromDate) + 1

结果是 4。

于 2011-04-07T13:31:12.420 回答