2010-08-31 2 views
6

У меня сложное время, основываясь на документации, выяснить, как сопоставить числа недель между Perl и MySQL.Форматы данных за недели

Как бы вычислить то же точное число недель в Perl и MySQL на основе временной отметки unix в том же часовом поясе?

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

ответ

4

Для Perl загляните в модуль DateTime. Она поставляет week() метод, который может вернуть номер недели в году для данного DateTime объекта:

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

Обратите внимание, что год имеет значение, как дата может быть в неделю в течение предыдущего или следующего года. Это из-за стандарта ISO на «неделю», где первая неделя года такова, что четвертый день января. Таким образом, дата, подобная 1 января, может быть на последней неделе предыдущего года.

Для неподготовленного глаза это выглядит так, как функция MySQL YEARWEEK() может делать то же самое, или как Mikey1980 suggests, попробуйте функцию WEEKOFYEAR(). Похоже, что YEARWEEK() делает то же самое, как и its documentation говорит:

год в результате может отличаться от года в дате аргумента для первой и последней недели года.

... но я не могу гарантировать, что они делают то же самое. :-)

+5

В «неделе недели» DateTime используется определение ISO 8601. Чтобы заставить MySQL сделать то же самое, используйте режим 3: 'YEARWEEK (from_unixtime (datefield), 3)'. – cjm

+1

Примечание: Функция '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'использует '' '' '' определение ISO 8601 для номера недели. POSIX определяет первое воскресенье января как первый день недели 1 (за любые дни до этого, составляющие неполную неделю 0). – cjm

2

Для MySQL попробовать этот запрос:

SELECT WEEKOFYEAR(from_unixtime(datefield)) FROM table; 

К сожалению, это только 1/2 ответ ваш ищет, но я надеюсь, что это помогает!

Смежные вопросы