2010-08-31 113 views
6

根據文檔,我正在很難弄清楚如何將Perl和MySQL之間的星期數等同起來。幾周的日期格式

基於同一時區的unix時間戳,我如何計算Perl和MySQL中的同一確切週數?

SELECT DATE_FORMAT(from_unixtime(datefield), '%Y%U') FROM table; 

print strftime('%Y%U', localtime($datevar)); 

應該產生相同的週數對於任何給定的時間戳。理想情況下,我希望週數是便攜式的,例如ISO 8601。雖然我的測試中的星期編號有時似乎匹配,但我無法在Perl和MySQL的文檔中找到任何確認日期格式明確遵守相同定義的內容。

謝謝!

+0

不知道你在PERL中如何做,但MySQL有一個WEEKOFYEAR()fn http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html# function_weekofyear – Mikey1980 2010-08-31 17:41:16

回答

4

對於Perl,請查看DateTime模塊。它提供了一個week()方法,即可以返回一年的週數爲給定DateTime對象:

($week_year, $week_number) = $dt->week; 

注意的是,今年的問題,作爲一個日期可以在一週內上一個或下一年。這是因爲「星期」的ISO標準,其中第一週是包含1月第四天的那一週。因此,像1月1日這樣的日期可能會在上一年的最後一週。

對於未經訓練的眼睛,它看起來像MySQL的YEARWEEK()函數可以做同樣的事情,或者如Mikey1980 suggests,嘗試WEEKOFYEAR()函數。它看起來像YEARWEEK()做同樣的事情,如its documentation說:

在結果中今年可能會從第一和今年的最後一個星期的時間參數年不同。

...但我不能保證他們做同樣的事情。 :-)

+5

DateTime的'week'使用ISO 8601定義。爲了讓MySQL執行相同的操作,使用模式3:'YEARWEEK(from_unixtime(datefield),3)'。 – cjm 2010-08-31 20:05:14

+1

注意:POSIX'strftime'函數的'%U'不會使用ISO 8601定義的星期編號。 POSIX將1月份的第一個星期日定義爲第1周的第一天(在此之前的任何一天形成了第0周的部分週期)。 – cjm 2010-08-31 20:18:39

2

對於MySQL嘗試此查詢:

SELECT WEEKOFYEAR(from_unixtime(datefield)) FROM table; 

對不起,這只是你的1/2尋找的答案,但我希望它能幫助!