I MariaDB, TIMESTAMPDIFF()
är en inbyggd datum- och tidsfunktion som returnerar skillnaden mellan två datum- eller datetime-uttryck.
Syntax
Syntaxen ser ut så här:
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
Där unit
är ett av följande värden:
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
Enheterna kan valfritt ha prefixet SQL_TSI_
.
TIMESTAMPDIFF()
returnerar datetime_expr2
– datetime_expr1
.
Ett uttryck kan vara ett datum och det andra ett datum och tid. Datumvärden behandlas som att de har en tidsdel av 00:00:00
där det behövs.
Exempel
Här är ett exempel att visa:
SELECT TIMESTAMPDIFF(DAY, '2030-02-01', '2030-03-01');
Resultat:
+------------------------------------------------+ | TIMESTAMPDIFF(DAY, '2030-02-01', '2030-03-01') | +------------------------------------------------+ | 28 | +------------------------------------------------+
Negativt resultat
Att byta datum ger ett negativt resultat:
SELECT TIMESTAMPDIFF(DAY, '2030-03-01', '2030-02-01');
Resultat:
+------------------------------------------------+ | TIMESTAMPDIFF(DAY, '2030-03-01', '2030-02-01') | +------------------------------------------------+ | -28 | +------------------------------------------------+
Datetime-värden
Här är ett exempel på hur du skickar ett datetime-värde:
SELECT TIMESTAMPDIFF(
HOUR,
'2030-02-01 00:00:00',
'2030-02-01 12:30:45'
)
AS Result;
Resultat:
+--------+ | Result | +--------+ | 12 | +--------+
Jag angav HOUR
, och därför ignorerar den minuter och sekunder.
Blandade typer
Här är ett exempel på hur du skickar både ett datum och ett datetime-värde:
SELECT TIMESTAMPDIFF(
HOUR,
'2030-02-01',
'2030-02-01 12:30:45'
)
AS Result;
Resultat:
+--------+ | Result | +--------+ | 12 | +--------+
Som nämnts behandlas datumvärden som att ha en tidsdel av 00:00:00
.
Lägga till en SQL_TSI_
Prefix
Enheten kan innehålla en SQL_TSI_
prefix vid behov:
SELECT TIMESTAMPDIFF(
SQL_TSI_YEAR,
'2030-02-01',
'2035-02-01'
)
AS Result;
Resultat:
+--------+ | Result | +--------+ | 5 | +--------+
Mikrosekunder
Här är ett exempel som returnerar mikrosekunder:
SELECT TIMESTAMPDIFF(
MICROSECOND,
'2030-02-01 10:30:45.000000',
'2030-02-01 10:30:45.123456'
)
AS Result;
Resultat:
+--------+ | Result | +--------+ | 123456 | +--------+
Här är en där mikrosekunder faktiskt inte anges i datetime-värdena:
SELECT TIMESTAMPDIFF(
MICROSECOND,
'2030-02-01 10:30:45',
'2030-02-01 12:30:45'
)
AS Result;
Resultat:
+------------+ | Result | +------------+ | 7200000000 | +------------+
Aktuellt datum
Vi kan skicka NOW()
ett av datetime-argumenten för att jämföra aktuellt datum och tid med ett annat datum:
SELECT
NOW(),
TIMESTAMPDIFF(DAY, NOW(), '2021-03-31') AS Diff;
Resultat:
+---------------------+------+ | NOW() | Diff | +---------------------+------+ | 2021-05-30 09:29:01 | -60 | +---------------------+------+
Nulldatum
Om ett av datumen är null
, resultatet är null
:
SELECT TIMESTAMPDIFF(
YEAR,
'2030-02-01',
NULL
)
AS Result;
Resultat:
+--------+ | Result | +--------+ | NULL | +--------+
Argument saknas
Anropar TIMESTAMPDIFF()
med fel antal argument, eller utan att skicka några argument, resulterar i ett fel:
SELECT TIMESTAMPDIFF();
Resultat:
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
Och ett annat exempel:
SELECT TIMESTAMPDIFF('2020-12-09');
Resultat:
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