SQL Server:按周分组,按1天休息

SQL Server:按周分组,按1天休息,sql,sql-server,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(

使用语法

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

我想这取决于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
i、 e.1月29日是1月30日,而不是1月23日或1月30日


很明显,我遗漏了一些东西,但无法思考它可能是什么。

为了分组的目的,这应该将日期转换为一周的第一天

set datefirst 1
select dateadd(day, -1 * (datepart(weekday, getdate()) - 1), getdate())
请注意,
set datefirst 1
将一周的第一天设置为星期一。您可以更改此声明以更改一周的第一天以符合您的期望(请参见)

这是正确的

无论
@@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)

DATEDIFF不尊重DATEFIRST设置

这里有一个类似的问题,还有一个潜在的解决办法:


当然,问题是它似乎与它本身不一致。我在“set datefirst”上读了一遍,发现你已经知道“一周的第一天”,所以我删除了我的评论。我认为这是不正确的
DATEDIFF()
没有看到
DATEFIRST
的值。谢谢Andy,我想我希望有一种按天、周、月等进行分组的“全面”语法。但我想没有。@aF。这就是我不使用DATEDIFF:-)我想aF可能有“原因”,这就是Andy给出正确答案的原因。现在一切都好了,再次感谢。啊,我遗漏了一点,那就是我不仅想按周分组,而且还想返回日期作为该周的开始,@gbn的解决方案也这样做
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)