SQL DateDiff周 - 需要和替代

时间:2011-04-07 13:25:21

标签: tsql sql-server-2008 datediff

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

对我来说不幸的是,那不是我追求的。例如,2012年6月1日 - > 2012年6月30日跨越4个界限,但为期5周。

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

更新

试着澄清我到底发生了什么:

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

另外,对于刚刚接过日期并添加一个的建议,这是行不通的。例如,2010年2月仅与4周相交。并且DateDiff调用返回4,这意味着简单地添加1会给我留下错误的周数。

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

编辑:实际上,根据这篇文章: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为language sensistive。通过将语言设置为british,您可以在一周的第一天进行星期一。
  2. 这将返回2010年2月和2012年6月的正确的值! (因为星期一而不是星期日是一周的第一天)。
  3. 它似乎也会在1月和12月(无论年份)返回正确的周数。 isoww参数使用星期一作为一周的第一天,但​​它导致1月有时从第52/53周开始到12月有时在第1周结束(这将使您的选择语句更复杂)

答案 1 :(得分: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。