【问题标题】:SQL DateDiff Weeks - Need and alternativeSQL DateDiff Weeks - 需要和替代方案
【发布时间】:2011-04-07 13:25:20
【问题描述】:

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

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

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

更新

尝试澄清我的目标:

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

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

【问题讨论】:

  • 您是否在查找给定月份的周数(全部和部分)?例如,您是否会说 2011 年 4 月涵盖 5 周,而 2011 年 10 月涵盖 6 周?
  • 您能否说明您对哪个日期相关的差异感兴趣?特定的周数,特定的月数?相对于什么?具体日期?具体的日期和时间?
  • @ilivewithian:看看我修改后的答案
  • 你如何定义周——美国惯例“天跨度从星期日开始到星期六结束”,还是必须比这更灵活?不同的国家/宗教,不同的定义......
  • @Philip 好问题,对于这种情况,一周需要从星期一开始。

标签: tsql sql-server-2008 datediff


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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,因为 2010 年 2 月 28 日星期日是第五周的第一天。

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

    set datefirst 1
    
    declare @FromDate datetime = '20100201'
    declare @ToDate datetime = '20100228'
    
    select datepart(week, @ToDate) - datepart(week, @FromDate) + 1
    

    结果是 4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多