2010-08-31 108 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寻找的答案,但我希望它能帮助!