简体   繁体   English

SQL Server:按周分组1天

[英]SQL Server : group by week off by 1 day

Using the syntax 使用语法

dateadd(week, datediff(week, 0, CURRENT_TIMESTAMP),0)

to group data by week it appears that the last day of the week gets put into the following week. 按周分组数据似乎将一周的最后一天放入下一周。

In a simple example 在一个简单的例子中

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)

I would expect to return 我希望能回来

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

or 要么

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

depending on DATEFIRST settings I guess 我想,取决于DATEFIRST设置

however it returns 然而它又回来了

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

ie the 29 January is in the week of 30th January not 23rd January or 30th January as expected. 即1月29日是1月30日那一周,而不是1月23日或1月30日。

I'm clearly missing something but can't think what it might be. 我显然错过了一些东西,却想不出它会是什么。

This is correct. 这是对的。

No matter what @@DATEFIRST is, there is always the same number of whole weeks between now and 01 Jan 1900. As @@DATEFIRST changes, it affects both "start" and "end" week. 不管是什么@@DATEFIRST是,总是有相同数量的整周的现在和01一月1900之间作为@@DATEFIRST的变化,它影响 “开始”和“结束”的一周。

DATEADD then just adds 7 day periods because it ignores @@DATEFIRST 然后DATEADD只增加7天的时间段,因为它忽略了@@ DATEFIRST

You can force it by choosing the DATEADD base 您可以通过选择DATEADD基础来强制它

Example: 01 Jan 1900 is a Monday. 示例:1900年1月1日是星期一。

You want Sunday? 你想要周日吗? Then base to 31 Dec 1899 然后根据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)

You want Tuesday? 你想要周二吗? Then base to 02 Jan 1900 然后基地到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)

This should convert the date to the first day of the week for the purposes of grouping 这应该将日期转换为一周的第一天以进行分组

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

Note that the set datefirst 1 sets the first day of the week as Monday. 请注意, set datefirst 1将星期的第一天设置为星期一。 You can alter this statement to change the first day of the week to fit to your expectations (see http://msdn.microsoft.com/en-us/library/ms181598.aspx ) 您可以更改此语句以更改一周的第一天以符合您的期望(请参阅http://msdn.microsoft.com/en-us/library/ms181598.aspx

DATEDIFF doesn't respect the DATEFIRST setting. DATEDIFF不尊重DATEFIRST设置。

Here's a similar question, with a potential workaround: 这是一个类似的问题,有一个潜在的解决方法:

Is it possible to set start of week for T-SQL DATEDIFF function? 是否可以为T-SQL DATEDIFF函数设置星期开始?

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

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