SQL Server:按周分组1天

时间:2012-02-24 13:09:58

标签: sql sql-server

使用语法

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

我显然错过了一些东西但却无法想象它会是什么。

3 个答案:

答案 0 :(得分:4)

这是正确的。

无论@@DATEFIRST是什么,从现在到1900年1月1日之间总有相同数量的整周。当@@DATEFIRST发生变化时,它会影响两者“开始”和“结束”一周。

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

您可以通过选择DATEADD base

来强制它

示例: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)

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

DATEDIFF不尊重DATEFIRST设置。

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

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