2012-05-18 139 views
2

我們有客戶,目前已定義從星期六,星期日或星期一開始的星期。遇到了這些DATE_FORMAT選項,這些選項很好地處理了星期一和星期一開始的一週,但無法在星期六開始的一週內找到相同的方法。有什麼建議麼?從星期六開始的週數周

%U Week (00..53), where Sunday is the first day of the week 
%u Week (00..53), where Monday is the first day of the week 

回答

2

我花了一段時間思考這個問題。

ISO standard定義了週一開始的第一週,包含一年的第4天。 MySQL的函數提供much more choices

date_format()標記%U%u正在使用符號,其中第一週是第一週週日或週一首次遇見的那一天。由於這不符合ISO標準,我將提供兩種變體。

如果你想數週數從週六開始,第一年的周是包含週六的一個,你可以使用下列表達式之一:

SELECT sign(dayofweek(current_date) - 7) + ceil(dayofyear(current_date)/7); 
SELECT ceil((dayofyear(current_date)+ 
      (dayofweek(date_format(current_date, '%Y-01-01'))%7-7))/7); 

如果第一年的周是一個地方第4天使用:

SELECT ceil((dayofyear(current_date)+ 
      (dayofweek(date_format(current_date, '%Y-01-04'))%7-4+1))/7); 

第一個表達式非常簡單。

我會詳細介紹第二和第三個。我計算一週中的當前日數,除以7並限制上限,很簡單。儘管如此,週數仍需根據年初的情況進行調整。

  • 對於第一種情況(第一週的第一個星期六開始),我拿某一天的一週的一月/中受今年1,使週六0一天,然後調整一天的年的差異。這使得第一個星期六之前的所有日子都會產生負調整數,並且它的上限爲零;
  • 第2個案例(第1個星期是一年中第4個星期的那個),在學科的1月/ 4年的星期幾作爲當天的0-4+1公式給出了在1月4日之前的第一個星期六進行調整,+1用於從1開始,而不是從0開始的一年的日子。負調整表示一年的第一天不在一年的第一週。

這裏是SQL Fiddle上的一些測試日期。

如果您想從任何其他日子開始計算幾周,您只需更改公式,使該日的順序爲0。再說了,算從週三開始幾周,使用方法:

SELECT ceil((dayofyear(current_date)+ 
    ((dayofweek(date_format(current_date, '%Y-01-04'))+3)%7-4+1))/7); 

+3用作它補充週三至7 dayofweek()值。

3

我有一個類似的問題:我需要計算基於以下規則週數:

  • 周開始於週五
  • 的一年中的剩餘天(上週五後的日子未完成一週的年份)應計入第二年的第一週的 。

例如:

  • 27/12/2012(星期四)應該是52周2012的
  • 28/12/2012(星期五)應該是1周2013
  • 周2013年1變爲從28/12/2012至2013年3月

我說這句話,計算兩者的一年WEEKNUMBER根據這些規則,你可以輕鬆地適應您的circunstance:

SELECT IF(ceil((dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1)/7) > 52, YEAR(current_date)+1, YEAR(current_date)), 
     IF(ceil((dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1)/7) > 52, 1, ceil((dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1)/7)); 

棘手的部分就是這個表達式:

ceil((dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1)/7) 

其餘的(如果條款)只是爲了適應表達式的結果,使今年+ 1周53周= 1。

我會盡我所能解釋表達。下面的表達式爲您提供了週數純淨簡單(當年7天在一週除以天四捨五入):

ceil((dayofyear(current_date))/7) 

但是現在你想讓它開始在星期五(或任何其他天) 。要做到這一點,您需要添加到當前日期,即前一年的第一週的日子(這與您前幾天實際開始的日期相同,因爲您的第一週包含前一年的日期)。 這個表達式的計算,基於對揚平日/ 1偏移:

dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET 

偏移量是7,並且希望weekdaynumber之間的差異的一週開始:

  • 0週六
  • 1日
  • 3日星期三 ...

所以,現在你只需將它添加到以前的一個導致上述算式,計算開始在任何工作日,並假設1周開始,比上一年的週數:

ceil((dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET)/7) 

然後我剛剛添加了一個IF,將第53週轉換爲第1周,如果是第53周,則增加第1個年份。

相關問題