[英]SQL Server : group by week off by 1 day
使用语法
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
是,总是有相同数量的整周的现在和01一月1900之间作为@@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)
这应该将日期转换为一周的第一天以进行分组
set datefirst 1
select dateadd(day, -1 * (datepart(weekday, getdate()) - 1), getdate())
请注意, set datefirst 1
将星期的第一天设置为星期一。 您可以更改此语句以更改一周的第一天以符合您的期望(请参阅http://msdn.microsoft.com/en-us/library/ms181598.aspx )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.