2010-08-31 21 views
6

Estoy teniendo un momento difícil, basado en la documentación, de averiguar cómo equiparar los números de semana entre Perl y MySQL.Formatos de fecha para las semanas

¿Cómo puedo calcular el mismo número exacto de semana tanto en Perl como en MySQL basado en una marca de tiempo Unix en la misma zona horaria?

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

y

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

debería producir números de semana idénticos para cualquier marca de tiempo dado. Idealmente me gustaría que el número de semana sea algo portátil, como ISO 8601. Si bien los números de la semana en mi prueba parecen coincidir a veces, no puedo encontrar nada en la documentación para Perl y MySQL que confirme que el formato de fecha se adhiere claramente a la misma definición.

Gracias!

+0

No estoy seguro de cómo hacerlo en PERL pero MySQL tiene un WEEKOFYEAR() fn http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html# function_weekofyear – Mikey1980

Respuesta

4

Para Perl, mira en el módulo DateTime. Se suministra un método week(), que puede devolver el número de semana del año para un objeto dado DateTime:

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

Tenga en cuenta que las cuestiones año, como puede ser la fecha en la semana durante el año anterior o siguiente. Esto se debe al estándar ISO para "semana", donde la primera semana del año es la que contiene el cuarto día de enero. Por lo tanto, una fecha como el 1 de enero podría ser en la última semana del año anterior.

Para el ojo inexperto parece que la función YEARWEEK() de MySQL podría hacer lo mismo, o como Mikey1980 suggests, pruebe la función WEEKOFYEAR(). Parece que YEARWEEK() hace lo mismo, como its documentation dice:

El año en el resultado puede ser diferente del año en el argumento de fecha para la primera y la última semana del año.

... pero no puedo garantizar que hagan lo mismo. :-)

+5

La 'semana' de DateTime usa la definición ISO 8601. Para hacer que MySQL haga lo mismo, use el modo 3: 'YEARWEEK (from_unixtime (datefield), 3)'. – cjm

+1

Nota: La función '% U' de POSIX' strftime' no _ utiliza _ la definición ISO 8601 para el número de semana. POSIX define el primer domingo de enero como el primer día de la semana 1 (con cualquier día anterior formando una semana parcial 0). – cjm

2

Para MySQL Intentar esta consulta:

SELECT WEEKOFYEAR(from_unixtime(datefield)) FROM table; 

sentimos que es sólo media la respuesta que busca, pero yo creo que sirve!

Cuestiones relacionadas