W MariaDB, TIMESTAMPDIFF()
to wbudowana funkcja daty i czasu, która zwraca różnicę między dwoma wyrażeniami daty lub czasu.
Składnia
Składnia wygląda tak:
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
Gdzie unit
jest jedną z następujących wartości:
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
Jednostki mogą opcjonalnie mieć przedrostek SQL_TSI_
.
TIMESTAMPDIFF()
zwraca datetime_expr2
– datetime_expr1
.
Jedno wyrażenie może być datą, a drugie datą i godziną. Wartości dat są traktowane jako mające część czasu 00:00:00
w razie potrzeby.
Przykład
Oto przykład do zademonstrowania:
SELECT TIMESTAMPDIFF(DAY, '2030-02-01', '2030-03-01');
Wynik:
+------------------------------------------------+ | TIMESTAMPDIFF(DAY, '2030-02-01', '2030-03-01') | +------------------------------------------------+ | 28 | +------------------------------------------------+
Wynik negatywny
Zamiana dat daje wynik negatywny:
SELECT TIMESTAMPDIFF(DAY, '2030-03-01', '2030-02-01');
Wynik:
+------------------------------------------------+ | TIMESTAMPDIFF(DAY, '2030-03-01', '2030-02-01') | +------------------------------------------------+ | -28 | +------------------------------------------------+
Wartości daty i godziny
Oto przykład przekazywania wartości daty i godziny:
SELECT TIMESTAMPDIFF(
HOUR,
'2030-02-01 00:00:00',
'2030-02-01 12:30:45'
)
AS Result;
Wynik:
+--------+ | Result | +--------+ | 12 | +--------+
Określiłem HOUR
, więc ignoruje część minut i sekund.
Typy mieszane
Oto przykład przekazywania zarówno daty, jak i wartości daty i godziny:
SELECT TIMESTAMPDIFF(
HOUR,
'2030-02-01',
'2030-02-01 12:30:45'
)
AS Result;
Wynik:
+--------+ | Result | +--------+ | 12 | +--------+
Jak wspomniano, wartości dat są traktowane jako mające część czasu 00:00:00
.
Dodawanie SQL_TSI_
Prefiks
Jednostka może zawierać SQL_TSI_
prefiks, jeśli jest wymagany:
SELECT TIMESTAMPDIFF(
SQL_TSI_YEAR,
'2030-02-01',
'2035-02-01'
)
AS Result;
Wynik:
+--------+ | Result | +--------+ | 5 | +--------+
Mikrosekundy
Oto przykład zwracający mikrosekundy:
SELECT TIMESTAMPDIFF(
MICROSECOND,
'2030-02-01 10:30:45.000000',
'2030-02-01 10:30:45.123456'
)
AS Result;
Wynik:
+--------+ | Result | +--------+ | 123456 | +--------+
Oto jeden, w którym mikrosekundy nie są tak naprawdę określone w wartościach daty i godziny:
SELECT TIMESTAMPDIFF(
MICROSECOND,
'2030-02-01 10:30:45',
'2030-02-01 12:30:45'
)
AS Result;
Wynik:
+------------+ | Result | +------------+ | 7200000000 | +------------+
Aktualna data
Możemy przekazać NOW()
jeden z argumentów datetime w celu porównania bieżącej daty i godziny z inną datą:
SELECT
NOW(),
TIMESTAMPDIFF(DAY, NOW(), '2021-03-31') AS Diff;
Wynik:
+---------------------+------+ | NOW() | Diff | +---------------------+------+ | 2021-05-30 09:29:01 | -60 | +---------------------+------+
Daty zerowe
Jeśli jedna z dat to null
, wynik to null
:
SELECT TIMESTAMPDIFF(
YEAR,
'2030-02-01',
NULL
)
AS Result;
Wynik:
+--------+ | Result | +--------+ | NULL | +--------+
Brakujący argument
Wywołanie TIMESTAMPDIFF()
z niewłaściwą liczbą argumentów lub bez przekazywania jakichkolwiek argumentów powoduje błąd:
SELECT TIMESTAMPDIFF();
Wynik:
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
I kolejny przykład:
SELECT TIMESTAMPDIFF('2020-12-09');
Wynik:
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 '10, '2020-12-09')' at line 1