【问题标题】:SQL Server : group by week off by 1 daySQL Server:按周分组休息 1 天
【发布时间】:2012-02-24 21:26:44
【问题描述】:

使用语法

dateadd(week, datediff(week, 0, CURRENT_TIMESTAMP),0)

按周对数据进行分组,似乎将一周的最后一天放入下一周。

举个简单的例子

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),0)
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),0)
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),0)
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),0)
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),0)

我希望回来

Jan 23 2012 12:00AM
Jan 23 2012 12:00AM
Jan 23 2012 12:00AM
Jan 30 2012 12:00AM
Jan 30 2012 12:00AM

Jan 22 2012 12:00AM
Jan 22 2012 12:00AM
Jan 29 2012 12:00AM
Jan 29 2012 12:00AM
Jan 29 2012 12:00AM

我猜取决于 DATEFIRST 设置

不管怎么返回

Jan 23 2012 12:00AM
Jan 23 2012 12:00AM
Jan 30 2012 12:00AM
Jan 30 2012 12:00AM
Jan 30 2012 12:00AM

即1 月 29 日是 1 月 30 日这一周,而不是预期的 1 月 23 日或 1 月 30 日。

我显然错过了一些东西,但想不出它可能是什么。

【问题讨论】:

  • 当然,关键是它似乎与自身不一致
  • 我阅读了“set datefirst”,发现您已经知道“一周的第一天”,所以我删除了我的评论。

标签: sql sql-server


【解决方案1】:

这是正确的。

无论@@DATEFIRST 是什么,从现在到 1900 年 1 月 1 日之间的整周数总是相同的。随着@@DATEFIRST 的变化,它会影响“开始”和“结束”周。

DATEADD 然后只添加 7 天的时间段,因为它忽略了 @@DATEFIRST

您可以通过选择 DATEADD 基数来强制它

示例:1900 年 1 月 1 日是星期一。

你想要星期天吗?然后基地到 1899 年 12 月 31 日

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),-1)
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),-1)
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),-1)
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),-1)
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),-1)

你想要星期二吗?然后基地到 1900 年 1 月 2 日

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),1)
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),1)
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),1)
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),1)
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),1)

【讨论】:

    【解决方案2】:

    这应该将日期转换为一周的第一天以进行分组

    set datefirst 1
    select dateadd(day, -1 * (datepart(weekday, getdate()) - 1), getdate())
    

    请注意,set datefirst 1 将一周的第一天设置为星期一。您可以更改此语句以更改一周的第一天以符合您的期望(请参阅http://msdn.microsoft.com/en-us/library/ms181598.aspx

    【讨论】:

    • 我认为这是不正确的。 DATEDIFF() 看不到 DATEFIRST 值。
    • 谢谢安迪,我想我希望有一个按天、周月等分组的“包罗万象”语法,但我猜不是。
    • @aF。这就是为什么我不使用 DATEDIFF :-)
    • 我认为也许 aF 有“原因”,这就是安迪给出正确答案的原因。现在都整理好了,再次感谢。
    • 啊,我错过的一点是,我不仅要按周分组,还要返回日期作为那一周的开始,@gbn 的解决方案也这样做
    【解决方案3】:

    DATEDIFF 不遵守 DATEFIRST 设置。

    这是一个类似的问题,有一个潜在的解决方法:

    Is it possible to set start of week for T-SQL DATEDIFF function?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多