使用语法

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日。

我显然缺少了一些东西,但无法想象它可能是什么。

最佳答案

这是对的。

不管是什么@@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)

08-03 16:44