使用语法
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日。
我显然错过了一些东西但却无法想象它会是什么。
答案 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?