我們有客戶,目前已定義從星期六,星期日或星期一開始的星期。遇到了這些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
我們有客戶,目前已定義從星期六,星期日或星期一開始的星期。遇到了這些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
使基於DAYOFWEEK()
調整。
我花了一段時間思考這個問題。
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並限制上限,很簡單。儘管如此,週數仍需根據年初的情況進行調整。
0
一天,然後調整一天的年的差異。這使得第一個星期六之前的所有日子都會產生負調整數,並且它的上限爲零;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()
值。
我有一個類似的問題:我需要計算基於以下規則週數:
例如:
我說這句話,計算兩者的一年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之間的差異的一週開始:
所以,現在你只需將它添加到以前的一個導致上述算式,計算開始在任何工作日,並假設1周開始,比上一年的週數:
ceil((dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET)/7)
然後我剛剛添加了一個IF,將第53週轉換爲第1周,如果是第53周,則增加第1個年份。