2009-04-24 29 views
9

我正在尋找一個簡單的函數來獲取mysql查詢中每月的一週(而不是一年中最容易的一週)。mysql中每月的星期函數

我能想出的最好的是:

WEEK(dateField) - WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField)-1 DAY)) + 1 

我很想知道,如果我在這裏重新發明輪子,如果有一個更簡單和更清潔的解決方案?

回答

12

AFAIK,這個月的第一週沒有標準。

一年中的第一週是包含Jan 4th的一週。

你如何定義每月的第一個星期?

UPDATE:

你需要重寫查詢是這樣的:

SELECT WEEK(dateField, 5) - 
     WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField) - 1 DAY), 5) + 1 

,這樣一年的過渡被正確處理,並且星期Monday啓動。

否則,您的查詢很好。

+0

我想這可能不是最通用的解決方案,但是我需要一個星期的時間從星期一開始。所以說這個月的第一個星期日是星期天,那個星期天就會算作第一星期。如果這是有道理的...... – YiSh 2009-04-24 09:59:58

8

有一種替代方法有時用於報告數據庫。這是創建一個表,我們稱之爲ALMANAC,每個日期有一行(關鍵字),並且具有對報告目的可能有用的每個必需的日期屬性。

除了月份列的那一週,還可能有一個列表,看該日期是否是公司假期,以及類似的事情。如果貴公司的財政年度開始於七月或其他月份,則可以包括每個日期所屬的財政年度,財政月度,財政周等。

然後,你寫一個程序來填充此表中的空氣,給定一個日期範圍來填充。在這個程序中只包含一次瘋狂的日曆計算。

然後,當您需要知道其他表中某個日期的屬性時,您只需進行連接並使用該列。是的,這又是一次加入。不,這張桌子沒有正常化。但對於某些非常特殊的需求,它仍然是很好的設計。

0

我的解決方案一週開始。

SELECT (1 + ((DATE_FORMAT(DATE_ADD(LAST_DAY(DATE_ADD('2014-07-17', 
    INTERVAL -1 MONTH)), INTERVAL 1 DAY),'%w')+1) + 
    (DATE_FORMAT('2014-07-17', '%d')-2)) DIV 7) "week_of_month"; 
1

(只是爲了澄清對未來的讀者:因爲這意味着目前的答案是不能令人滿意賞金加入這個回答這個老問題,所以我加了這個解決方案/定義額外「配置選項」適用於各種情況。)

沒有爲Week of month沒有標準的定義,但一般的解決辦法是下面的公式,你可以configurate您的需求:

select (dayofmonth(dateField) + 6 + (7 - "min_days_for_partial_week") 
     - (weekday(datefield) - "weekday_startofweek" + 7) MOD 7) DIV 7 as week_of_month; 

其中

  • "weekday_startofweek"必須是取而代之的是你想成爲本週第一天的工作日(0 = Monday,6 = Sunday)。
  • "min_days_for_partial_week"是第一週必須計爲第1周的天數(值爲17)。常見值將是1(該月的第一天總是第1周),4(這將類似於「一年中的同一周」,其中第一週是包含星期四的那一週,所以具有至少4天)和7(第1周是第一個完整的一週)。

該公式將返回值060意味着當前星期是沒有足夠的天數爲1周,6只能發生在你允許用不到3天局部周是一週1

例子部分周:

如果你一週的第一天是星期一("weekday_startofweek" = 0)和第1周應始終是一整週("min_days_for_partial_week" = 7),這將簡化爲

select (dayofmonth(dateField) + 6 - weekday(datefield)) DIV 7 as week_of_month; 

例如,對於2016-06-02你會得到0,因爲六月2016年開始與週三y和爲2016-06-06你會得到1,因爲這是第一個星期一2016年6月

要模仿你的公式,其中一週的第一天總是1周("min_days_for_partial_week" = 1),以及本週日開始( "weekday_startofweek" = 6),這將是

select (dayofmonth(dateField) + 12 - (weekday(datefield) + 1) MOD 7) DIV 7 as week_of_month; 

雖然你可能想發表評論,妥善至2年,在那裏你的常量是從哪裏來的認識。

相關問題