mysql.h


WEEK()

WEEK(date [,mode])

Esta función devuelve el número de la semana para una fecha. El formato con dos argumentos permite especificar si la semana empieza en domingo o en lunes y si el valor de retorno debe estar en el rango 0-53 o 1-52. Cuando se omite el argumento de modo el valor por defecto usado es el de la variable del servidor default_week_format (o 0 en MySQL 4.0 o anterior). La tabla siguiente demuestra cómo trabaja el argumento mode:

Valor Significado
0 La semana empieza en domingo; devuelve un valor en el rango 0 a 53; la semana 1 es la primera semana que empieza en este año
1 La semana empieza en lunes; devuelve un valor en el rango 0 a 53; la semana 1 es la primera semana que tiene más de 3 días en este año
2 La semana empieza en domingo; devuelve un valor en el rango 1 a 53; la semana 1 es la primera semana que empieza en este año
3 La semana empieza en lunes; devuelve un valor en el rango 1 a 53; la semana 1 es la primera semana que tenga más de tres días en este año
4 La semana empieza en domingo; devuelve un valor en el rango 0 a 53; la semana 1 es la primera semana que tenga más de tres días en este año
5 La semana empieza en lunes; devuelve un valor en el rango 0 a 53; la semana 1 es la primera semana que empiece en este año
6 La semana empieza en domingo; devuelve un valor en el rango 1 a 53; la semana 1 es la primera semana que tenga más de tres días en este año
7 La semana empieza en lunes; devuelve un valor en el rango 1 a 53; la semana 1 es la primera semana que empiece en este este año

El valor de modo 3 puede usarse desde MySQL 4.0.5. El valor de modo 4 y superiores pueden usarse desde MySQL 4.0.17.

mysql> SELECT WEEK('1998-02-20');
+--------------------+
| WEEK('1998-02-20') |
+--------------------+
|                  7 |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT WEEK('1998-02-20',0);
+----------------------+
| WEEK('1998-02-20',0) |
+----------------------+
|                    7 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT WEEK('1998-02-20',1);
+----------------------+
| WEEK('1998-02-20',1) |
+----------------------+
|                    8 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT WEEK('1998-12-31',1);
+----------------------+
| WEEK('1998-12-31',1) |
+----------------------+
|                   53 |
+----------------------+
1 row in set (0.00 sec)

Nota: en la versión 4.0, WEEK(date,0) se modificó para que coincidiera con el calendario en USA. Antes de eso, WEEK() calculaba de forma incorrecta para fechas en USA. (En efecto, WEEK(date) y WEEK(date,0) era inorrecto en todos los casos.) So una fecha cae en la última semana del año anterior, MySQL retornará 0 si no se usa 2, 3, 6 o 7 como valor del argumento opcional mode:

mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
+--------------------+----------------------+
| YEAR('2000-01-01') | WEEK('2000-01-01',0) |
+--------------------+----------------------+
|               2000 |                    0 |
+--------------------+----------------------+
1 row in set (0.00 sec)

Se puede argumentar que MySQL debe devolver 52 en la función WEEK(), porque la fecha dada está en la semana 53 de 1999. Pero se ha decidido devolver 0 en su lugar ya que se prefiere que la función devuelva "el número de la semana en el año dado". Esto hace el uso de la función WEEK() function más fiable cuando se combina con otras funciones que extraen una parte de la fecha. Si se prefiere que el resultado sea evaluado con respecto al año que contiene el primer día de la semana para la fecha dada, se debe usar 2, 3, 6 ó 7 en el argumento mode.

mysql> SELECT WEEK('2000-01-01',2);
+----------------------+
| WEEK('2000-01-01',2) |
+----------------------+
|                   52 |
+----------------------+
1 row in set (0.00 sec)

Alternativamente, se puede usar la función YEARWEEK():

mysql> SELECT YEARWEEK('2000-01-01');
+------------------------+
| YEARWEEK('2000-01-01') |
+------------------------+
|                 199952 |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
+---------------------------------+
| MID(YEARWEEK('2000-01-01'),5,2) |
+---------------------------------+
| 52                              |
+---------------------------------+
1 row in set (0.00 sec)