繁体   English   中英

SQL Server:按周分组1天

[英]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

DATEDIFF不尊重DATEFIRST设置。

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

是否可以为T-SQL DATEDIFF函数设置星期开始?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM