2011-04-07 87 views
3

當計算兩個日期之間的差異時,MS SQL DateDiff函數計算跨越的邊界數。SQL DateDiff周 - 需要和替代

對我來說不幸的是,那不是我所追求的。例如,2012年6月1日至2012年6月30日跨越4個界限,但涵蓋5周。

是否有一個替代查詢,我可以運行,這將給我一個月的交錯數週?

UPDATE

要嘗試和澄清正是我後我:

對於任何給定的一個月,我需要與當月相交的週數。

此外,對於剛剛取了datediff並添加一個的建議,這是行不通的。例如2010年2月僅與4周相交。而DateDiff調用返回4,這意味着簡單地加1會使我錯誤的週數。

+0

你尋找特定月份中的週數(全部和部分)?例如,你會說2011年4月涵蓋5周和2011年10月涵蓋6周嗎? – JohnK813 2011-04-07 13:31:11

+0

您能否澄清您感興趣的日期相關差異?具體的幾個星期,具體的幾個月?相對於什麼?具體日期?一個特定的日期和時間? – 2011-04-07 13:32:44

+0

@ilivewithian:看看我修改後的答案 – 2011-04-07 14:03:41

回答

1

SET DATEFIRST在計算週數時很重要。要檢查你有什麼可以使用select @@datefirst。 @@ datefirst = 7意味着每週的第一天是星期日。

set datefirst 7 

declare @FromDate datetime = '20100201' 
declare @ToDate datetime = '20100228' 

select datepart(week, @ToDate) - datepart(week, @FromDate) + 1 

結果是5,因爲星期天28/2 - 2010是第五週的第一天。

如果你想以一週中的第一天的星期計算爲基礎,那麼你需要這樣做。

set datefirst 1 

declare @FromDate datetime = '20100201' 
declare @ToDate datetime = '20100228' 

select datepart(week, @ToDate) - datepart(week, @FromDate) + 1 

結果是4

4

當心:正確周計算是比你想象的一般棘手!

如果您使用Datepart(week, aDate)您對「周」這個概念做了很多假設。 星期一或星期一開始嗎?你如何處理第一週和第五週的過渡。這取決於你使用哪一週計算規則周在一年的實際數量是不同的(first4dayweek,weekOfJan1等)

,如果你只是想處理的差異,你可以,如果首先使用

DATEDIFF('s', firstDateTime, secondDateTime) > (7 * 86400 * numberOfWeeks) 

日期時間是在2011-01-01 15:43:22則差值是5周後2011-02-05 15:43:22

編輯:實際上,根據這個帖子:Wrong week number using DATEPART in SQL Server可以現在使用Datepart(isoww, aDate)獲得ISO 8601週數。我知道week壞了,但並不是說現在有一個修復。涼!

這工作,如果你使用的是週一是一週

set language = british 
select datepart(ww, @endofMonthDate) - 
     datepart(ww, @startofMonthDate) + 1 
  1. 日期部分是language sensistive的第一天。通過將語言設置爲british,您可以在星期一進行本週的第一天。
  2. 這將返回2010年和2012年6月feburary的正確的值! (因爲星期一而不是星期日是一週的第一天)。
  3. 它似乎也會在一月和十二月(不分年份)恢復正確的週數。 isoww參數使用星期一作爲一週的第一天,但​​它會導致1月有時在第52/53周開始,12月有時在第1周結束(這會使您的選擇語句更復雜)