W MariaDB, YEARWEEK()
to wbudowana funkcja daty i czasu, która zwraca rok i tydzień dla podanej daty.
Przyjmuje dwa argumenty; data, z której chcesz wyodrębnić rok i tydzień, oraz opcjonalny argument trybu określający tryb, który ma zostać użyty w wyniku.
Zwraca tydzień jako liczbę z zakresu 0
do 53
lub 1
do 53
, w zależności od używanego trybu. Ponadto rok w wyniku może różnić się od roku w argumencie daty dla pierwszego i ostatniego tygodnia roku.
Składnia
Składnia wygląda tak:
YEARWEEK(date), YEARWEEK(date,mode)
Co można również wyrazić w ten sposób:
YEARWEEK(date[,mode])
Gdzie date
jest wyrażeniem daty, z którego pobierany jest rok i tydzień, oraz mode
jest opcjonalnym argumentem, który pozwala określić tryb do użycia.
Tryby
Opcjonalny mode
argument określa, czy tydzień zaczyna się w niedzielę, czy w poniedziałek, i czy wartość zwracana powinna mieścić się w zakresie od 0
do 53
lub z 1
do 53
.
Argument mode może być jednym z następujących:
Tryb | pierwszy dzień tygodnia | Zakres | Tydzień 1 to pierwszy tydzień z… |
---|---|---|---|
0 | Niedziela | 0-53 | niedziela w tym roku |
1 | Poniedziałek | 0-53 | więcej niż 3 dni w tym roku |
2 | Niedziela | 1-53 | niedziela w tym roku |
3 | Poniedziałek | 1-53 | więcej niż 3 dni w tym roku (zgodnie z ISO 8601:1988) |
4 | Niedziela | 0-53 | więcej niż 3 dni w tym roku |
5 | Poniedziałek | 0-53 | poniedziałek w tym roku |
6 | Niedziela | 1-53 | więcej niż 3 dni w tym roku |
7 | Poniedziałek | 1-53 | poniedziałek w tym roku |
Jeśli argument mode zostanie pominięty, wartość default_week_format
używana jest zmienna systemowa.
Sprawdźmy wartość mojego default_week_format
zmienna systemowa:
SELECT @@default_week_format;
Wynik:
+-----------------------+ | @@default_week_format | +-----------------------+ | 0 | +-----------------------+
Teraz, kiedy uruchamiam YEARWEEK()
bez określenia trybu użyje trybu 0
.
Przykład
Oto przykład wywołania YEARWEEK()
bez określania trybu:
SELECT YEARWEEK('2030-01-01');
Wynik:
+------------------------+ | YEARWEEK('2030-01-01') | +------------------------+ | 202952 | +------------------------+
W tym przypadku wynikowy rok i tydzień pochodzą z poprzedniego roku.
Określ tryb
Oto przykład określenia trybu:
SELECT YEARWEEK('2030-01-01', 1);
Wynik:
+---------------------------+ | YEARWEEK('2030-01-01', 1) | +---------------------------+ | 203001 | +---------------------------+
Tym razem wynik jest inny.
Przeanalizujmy wszystkie tryby dla tej samej daty:
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);
Wynik (przy użyciu wyjścia pionowego):
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
Wartości daty i godziny
YEARWEEK()
funkcja działa również z wartościami daty/godziny:
SELECT YEARWEEK('2030-08-01 10:30:45');
Wynik:
+---------------------------------+ | YEARWEEK('2030-08-01 10:30:45') | +---------------------------------+ | 203030 | +---------------------------------+
Daty numeryczne
Możliwe jest również przekazywanie dat jako liczby, o ile ma to sens jako data.
Przykład
SELECT YEARWEEK(20301125);
Wynik:
+--------------------+ | YEARWEEK(20301125) | +--------------------+ | 203047 | +--------------------+
Lub nawet następujący (który używa dwucyfrowego roku):
SELECT YEARWEEK(301125);
Wynik:
+------------------+ | YEARWEEK(301125) | +------------------+ | 203047 | +------------------+
Ale to musi mieć sens jako randka. Oto, co się stanie, jeśli zwiększę część dnia do nieprawidłowego dnia:
SELECT YEARWEEK(20301135);
Wynik:
+--------------------+ | YEARWEEK(20301135) | +--------------------+ | NULL | +--------------------+ 1 row in set, 1 warning (0.000 sec)
Zwrócił null
z ostrzeżeniem.
Spójrzmy na ostrzeżenie:
SHOW WARNINGS;
Wynik:
+---------+------+--------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------+ | Warning | 1292 | Incorrect datetime value: '20301135' | +---------+------+--------------------------------------+
Inne ograniczniki
Możesz użyć innych ograniczników daty. MariaDB jest dość wyrozumiała, jeśli chodzi o ograniczniki dat. Oto kilka poprawnych przykładów:
SELECT
YEARWEEK('2030/06/25'),
YEARWEEK('2030,06,25'),
YEARWEEK('2030:06:25'),
YEARWEEK('2030;06!25');
Wynik (przy użyciu wyjścia pionowego):
YEARWEEK('2030/06/25'): 203025 YEARWEEK('2030,06,25'): 203025 YEARWEEK('2030:06:25'): 203025 YEARWEEK('2030;06!25'): 203025
Aktualna data
Możemy przekazać NOW()
jako argument datetime, aby użyć bieżącej daty:
SELECT
NOW(),
YEARWEEK(NOW());
Wynik:
+---------------------+-----------------+ | NOW() | YEARWEEK(NOW()) | +---------------------+-----------------+ | 2021-05-17 09:08:23 | 202120 | +---------------------+-----------------+
Nieprawidłowe argumenty
Po przekazaniu nieprawidłowego argumentu YEARWEEK()
zwraca null
:
SELECT YEARWEEK('2030-65-78');
Wynik:
+------------------------+ | YEARWEEK('2030-65-78') | +------------------------+ | NULL | +------------------------+ 1 row in set, 1 warning (0.000 sec)
Pokażmy ostrzeżenie:
SHOW WARNINGS;
Wynik:
+---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '2030-65-78' | +---------+------+----------------------------------------+
Brakujący argument
Wywołanie YEARWEEK()
z niewłaściwą liczbą argumentów lub bez przekazywania jakichkolwiek argumentów powoduje błąd:
SELECT YEARWEEK();
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'YEARWEEK'
I kolejny przykład:
SELECT YEARWEEK('2030-12-10', 1, 2);
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'YEARWEEK'