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