MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come funziona WEEK() in MariaDB

In MariaDB, WEEK() è una funzione di data e ora incorporata che restituisce la settimana da una determinata espressione di data.

Accetta due argomenti; la data da cui vuoi estrarre la settimana e un argomento di modalità facoltativo per specificare la modalità da utilizzare nel risultato.

Restituisce la settimana come numero nell'intervallo 0 a 53 o 1 a 53 , a seconda della modalità utilizzata.

Sintassi

La sintassi è questa:

WEEK(date[,mode])

Dove date è l'espressione di data da cui ottenere la settimana e mode è un argomento facoltativo che consente di specificare una modalità da utilizzare.

Modalità

La mode opzionale argomento determina se la settimana inizia domenica o lunedì e se il valore restituito deve essere compreso nell'intervallo da 0 a 53 o da 1 a 53 .

L'argomento modalità può essere uno dei seguenti:

Modalità 1° giorno della settimana Gamma La settimana 1 è la prima settimana con...
0 Domenica 0-53 una domenica di quest'anno
1 lunedì 0-53 più di 3 giorni quest'anno
2 Domenica 1-53 una domenica di quest'anno
3 lunedì 1-53 più di 3 giorni quest'anno
(secondo ISO 8601:1988)
4 Domenica 0-53 più di 3 giorni quest'anno
5 lunedì 0-53 un lunedì di quest'anno
6 Domenica 1-53 più di 3 giorni quest'anno
7 lunedì 1-53 un lunedì di quest'anno

Se l'argomento mode viene omesso, il valore del default_week_format viene utilizzata la variabile di sistema.

Controlliamo il valore del mio default_week_format variabile di sistema:

SELECT @@default_week_format;

Risultato:

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

Ora, quando eseguo WEEK() senza specificare una modalità, utilizzerà la modalità 0 .

Esempio

Ecco un esempio di chiamata a WEEK() senza specificare la modalità:

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

Risultato:

+--------------------+
| WEEK('2030-01-01') |
+--------------------+
|                  0 |
+--------------------+

Specifica una modalità

Ecco un esempio per specificare la modalità:

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

Risultato:

+-----------------------+
| WEEK('2030-01-01', 1) |
+-----------------------+
|                     1 |
+-----------------------+

Questa volta, il risultato è 1 invece di 0 .

Esaminiamo tutte le modalità per la stessa data:

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

Risultato (usando l'output verticale):

WEEK('2030-01-01', 0): 0
WEEK('2030-01-01', 1): 1
WEEK('2030-01-01', 2): 52
WEEK('2030-01-01', 3): 1
WEEK('2030-01-01', 4): 1
WEEK('2030-01-01', 5): 0
WEEK('2030-01-01', 6): 1
WEEK('2030-01-01', 7): 53

Valori di data e ora

La WEEK() la funzione funziona anche con i valori datetime:

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

Risultato:

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

Date numeriche

È anche possibile trasmettere le date come numero, purché abbia senso come data.

Esempio

SELECT WEEK(20301125);

Risultato:

+----------------+
| WEEK(20301125) |
+----------------+
|             47 |
+----------------+

O anche il seguente (che utilizza un anno a due cifre):

SELECT WEEK(301125);

Risultato:

+--------------+
| WEEK(301125) |
+--------------+
|           47 |
+--------------+

Ma deve avere un senso come appuntamento. Ecco cosa succede se aumento la parte del giorno a un giorno non valido:

SELECT WEEK(20301135);

Risultato:

+----------------+
| WEEK(20301135) |
+----------------+
|           NULL |
+----------------+
1 row in set, 1 warning (0.001 sec)

Ha restituito null con un avvertimento.

Diamo un'occhiata all'avviso:

SHOW WARNINGS;

Risultato:

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

Altri delimitatori

È possibile utilizzare altri delimitatori per la data. MariaDB è abbastanza clemente quando si tratta di delimitatori sulle date. Ecco alcuni validi esempi:

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

Risultato (usando l'output verticale):

WEEK('2030/06/25'): 25
WEEK('2030,06,25'): 25
WEEK('2030:06:25'): 25
WEEK('2030;06!25'): 25

Data attuale

Possiamo passare NOW() come argomento datetime per utilizzare la data corrente:

SELECT 
    NOW(),
    WEEK(NOW());

Risultato:

+---------------------+-------------+
| NOW()               | WEEK(NOW()) |
+---------------------+-------------+
| 2021-05-17 08:36:12 |          20 |
+---------------------+-------------+

Argomenti non validi

Quando viene passato un argomento non valido, WEEK() restituisce null :

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

Risultato:

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

Mostriamo l'avviso:

SHOW WARNINGS;

Risultato:

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

Argomento mancante

Chiamando WEEK() con il numero errato di argomenti, o senza passare alcun argomento, si verifica un errore:

SELECT WEEK();

Risultato:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1

E un altro esempio:

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

Risultato:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' 2)' at line 1