MS SQL DateDiff函数计算在计算两个日期之间的差异时交叉的边界数。
对我来说不幸的是,那不是我追求的。例如,2012年6月1日 - > 2012年6月30日跨越4个界限,但为期5周。
是否有我可以运行的替代查询,它会给我一个月相交的周数?
更新
试着澄清我到底发生了什么:
对于任何给定月份,我需要与该月相交的周数。
另外,对于刚刚接过日期并添加一个的建议,这是行不通的。例如,2010年2月仅与4周相交。并且DateDiff
调用返回4,这意味着简单地添加1会给我留下错误的周数。
答案 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
british
,您可以在一周的第一天进行星期一。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。