sql >> Base de Datos >  >> RDS >> MariaDB

Cómo funciona YEARWEEK() en MariaDB

En MariaDB, YEARWEEK() es una función de fecha y hora incorporada que devuelve el año y la semana para una fecha determinada.

Acepta dos argumentos; la fecha de la que desea extraer el año y la semana, y un argumento de modo opcional para especificar el modo que se usará en el resultado.

Devuelve la semana como un número en el rango 0 a 53 o 1 a 53 , según el modo que se utilice. Además, 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.

Sintaxis

La sintaxis es así:

YEARWEEK(date), YEARWEEK(date,mode)

Que también podría expresarse así:

YEARWEEK(date[,mode])

Donde date es la expresión de fecha para obtener el año y la semana, y mode es un argumento opcional que le permite especificar un modo para usar.

Modos

El mode opcional El argumento determina si la semana comienza el domingo o el lunes, y si el valor de retorno debe estar en el rango de 0 a 53 o desde 1 a 53 .

El argumento de modo puede ser cualquiera de los siguientes:

Modo 1er día de la semana Rango La semana 1 es la primera semana con...
0 domingo 0-53 un domingo de este año
1 lunes 0-53 más de 3 días este año
2 domingo 1-53 un domingo de este año
3 lunes 1-53 más de 3 días este año
(según ISO 8601:1988)
4 domingo 0-53 más de 3 días este año
5 lunes 0-53 un lunes de este año
6 domingo 1-53 más de 3 días este año
7 lunes 1-53 un lunes de este año

Si se omite el argumento de modo, el valor de default_week_format se utiliza la variable del sistema.

Comprobemos el valor de mi default_week_format variable del sistema:

SELECT @@default_week_format;

Resultado:

+-----------------------+
| @@default_week_format |
+-----------------------+
|                     0 |
+-----------------------+

Ahora, cuando ejecuto YEARWEEK() sin especificar un modo, utilizará el modo 0 .

Ejemplo

Aquí hay un ejemplo de llamar a YEARWEEK() sin especificar el modo:

SELECT YEARWEEK('2030-01-01');

Resultado:

+------------------------+
| YEARWEEK('2030-01-01') |
+------------------------+
|                 202952 |
+------------------------+

En este caso, el año y la semana resultantes son del año anterior.

Especifique un modo

Aquí hay un ejemplo de cómo especificar el modo:

SELECT YEARWEEK('2030-01-01', 1);

Resultado:

+---------------------------+
| YEARWEEK('2030-01-01', 1) |
+---------------------------+
|                    203001 |
+---------------------------+

Esta vez, el resultado es diferente.

Repasemos todos los modos para la misma fecha:

SELECT 
    YEARWEEK('2030-01-01', 0),
    YEARWEEK('2030-01-01', 1),
    YEARWEEK('2030-01-01', 2),
    YEARWEEK('2030-01-01', 3),
    YEARWEEK('2030-01-01', 4),
    YEARWEEK('2030-01-01', 5),
    YEARWEEK('2030-01-01', 6),
    YEARWEEK('2030-01-01', 7);

Resultado (usando salida vertical):

YEARWEEK('2030-01-01', 0): 202952
YEARWEEK('2030-01-01', 1): 203001
YEARWEEK('2030-01-01', 2): 202952
YEARWEEK('2030-01-01', 3): 203001
YEARWEEK('2030-01-01', 4): 203001
YEARWEEK('2030-01-01', 5): 202953
YEARWEEK('2030-01-01', 6): 203001
YEARWEEK('2030-01-01', 7): 202953

Valores de fecha y hora

El YEARWEEK() la función también funciona con valores de fecha y hora:

SELECT YEARWEEK('2030-08-01 10:30:45');

Resultado:

+---------------------------------+
| YEARWEEK('2030-08-01 10:30:45') |
+---------------------------------+
|                          203030 |
+---------------------------------+

Fechas numéricas

También es posible pasar fechas como un número, siempre que tenga sentido como fecha.

Ejemplo

SELECT YEARWEEK(20301125);

Resultado:

+--------------------+
| YEARWEEK(20301125) |
+--------------------+
|             203047 |
+--------------------+

O incluso lo siguiente (que usa un año de dos dígitos):

SELECT YEARWEEK(301125);

Resultado:

+------------------+
| YEARWEEK(301125) |
+------------------+
|           203047 |
+------------------+

Pero debe tener sentido como fecha. Esto es lo que sucede si aumento la parte del día a un día no válido:

SELECT YEARWEEK(20301135);

Resultado:

+--------------------+
| YEARWEEK(20301135) |
+--------------------+
|               NULL |
+--------------------+
1 row in set, 1 warning (0.000 sec)

Devolvió null con una advertencia

Veamos la advertencia:

SHOW WARNINGS;

Resultado:

+---------+------+--------------------------------------+
| Level   | Code | Message                              |
+---------+------+--------------------------------------+
| Warning | 1292 | Incorrect datetime value: '20301135' |
+---------+------+--------------------------------------+

Otros delimitadores

Puede utilizar otros delimitadores para la fecha. MariaDB es bastante indulgente cuando se trata de delimitadores en fechas. Aquí hay algunos ejemplos válidos:

SELECT 
    YEARWEEK('2030/06/25'),
    YEARWEEK('2030,06,25'),
    YEARWEEK('2030:06:25'),
    YEARWEEK('2030;06!25');

Resultado (usando salida vertical):

YEARWEEK('2030/06/25'): 203025
YEARWEEK('2030,06,25'): 203025
YEARWEEK('2030:06:25'): 203025
YEARWEEK('2030;06!25'): 203025

Fecha actual

Podemos pasar NOW() como argumento de fecha y hora para usar la fecha actual:

SELECT 
    NOW(),
    YEARWEEK(NOW());

Resultado:

+---------------------+-----------------+
| NOW()               | YEARWEEK(NOW()) |
+---------------------+-----------------+
| 2021-05-17 09:08:23 |          202120 |
+---------------------+-----------------+

Argumentos no válidos

Cuando se pasa un argumento no válido, YEARWEEK() devuelve null :

SELECT YEARWEEK('2030-65-78');

Resultado:

+------------------------+
| YEARWEEK('2030-65-78') |
+------------------------+
|                   NULL |
+------------------------+
1 row in set, 1 warning (0.000 sec)

Mostremos la advertencia:

SHOW WARNINGS;

Resultado:

+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Incorrect datetime value: '2030-65-78' |
+---------+------+----------------------------------------+

Argumento faltante

Llamando a YEARWEEK() con el número incorrecto de argumentos, o sin pasar ningún argumento, da como resultado un error:

SELECT YEARWEEK();

Resultado:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'YEARWEEK'

Y otro ejemplo:

SELECT YEARWEEK('2030-12-10', 1, 2);

Resultado:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'YEARWEEK'