有人可以好好解釋一下爲什麼這兩個結果不一樣嗎?PHP date('W')vs MySQL YEARWEEK(now())
我用PHP執行此操作。
date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312
當我與MySQL
SELECT YEARWEEK(now()); // outputs 201311
有人可以好好解釋一下爲什麼這兩個結果不一樣嗎?PHP date('W')vs MySQL YEARWEEK(now())
我用PHP執行此操作。
date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312
當我與MySQL
SELECT YEARWEEK(now()); // outputs 201311
您需要對MySQL的YEARWEEK呼叫指定模式3執行此:
SELECT YEARWEEK(now(),3);
的PHP date()
佔位根據W
返回週數到ISO 8601 specification。這意味着星期一從星期一開始(不是星期天),一年中的第一週是第一天(不是0),而這一週是第一天至少有4天在新的一年(所以這是包含新的一週的一週今年的第一個星期四)。據the documentation for the MySQL WEEK function的選項組合模式3
此外,拉Alles的注爲接受的答案,因爲它是重要的:佔位符Y
和W
不要一起去。如果您想要符合ISO週數的年份,則應使用o
而不是Y
。例如,考慮星期一,2014年12月29日:
date('YW', mktime(0,0,0,12,29,2014)); #=> 201401 : 1st week of 2014??
date('oW', mktime(0,0,0,12,29,2014)); #=> 201501 : better
YEARWEEK
需要一秒鐘(可選)參數指定星期[O- 53]或[1-53]的範圍內)。
該函數返回日期的星期數。 WEEK()的雙參數形式 可讓您指定星期一開始於星期天還是星期一 以及返回值是否應在0至 53或1至53的範圍內。如果模式參數被省略,則使用 default_week_format系統變量的值。
而date(W)
是ISO8601 date,總是在[01-53]的範圍內。因此我猜測YEARWEEK默認使用的是[0-53]範圍。
所以,如果你想獲得相同的結果嘗試使用1作爲第二個參數爲YEARWEEK
請注意,YEARWEEK(「2012-01-01」,3)=> 201152,而PHP「 YW「將給出201252.結果中的年份可能與當年第一個和最後一個星期的日期爭論的年份不同。 (即YEARWEEK中的年份是一週中的星期一的年份,而不是用於計算的日期的年份)。
爲了得到正確的結果,你需要做的
date("oW",mktime(0, 0, 0, 1, 1, 2012)); // outputs 201152
爲「O」爲您提供了新年的一週屬於。
我希望這會有所幫助。
謝謝你! – Kostanos 2013-08-01 18:34:48
謝謝你的提示 - 今天節省了我很多困惑和潛在的頭痛,因爲今天是明年的一部分。 – cincodenada 2014-12-29 19:24:42
謝謝馬克。它的工作原理是 – 2013-03-22 03:45:56
+1,但如果我想用YEARWEEK來每週彙總數據,並且希望星期天是一週的第一天,該怎麼辦?PHP似乎沒有改變周開始日的選項 – dzona 2014-02-01 16:51:15
這就是第二個參數(「模式」)指定的內容。閱讀文檔鏈接...模式0,2,4和6都在週日開始,周第一週是不同的,以及是否有第0周或第53周。 – 2014-02-01 17:41:56