I MySQL kan du bruge SUBTIME()
funktion til at trække en tidsværdi fra et tids- eller datetime-udtryk.
Måden det fungerer på er, at du giver to argumenter; den første er en værdi for tid eller dato, og den anden er en tidsværdi. SUBTIME()
funktion trækker derefter det andet argument fra det første og returnerer resultatet.
Syntaks
Syntaksen ser sådan ud:
SUBTIME(expr1,expr2)
Hvor expr1
kan enten være et klokkeslæts- eller datetime-udtryk og expr2
er et tidsudtryk.
Og så expr2
trækkes fra expr1
.
Eksempel 1 – Grundlæggende brug
Her er et eksempel til at demonstrere.
SELECT SUBTIME('12:35:00', '1:30');
Resultat:
+-----------------------------+ | SUBTIME('12:35:00', '1:30') | +-----------------------------+ | 11:05:00 | +-----------------------------+
Eksempel 2 – At trække sekunder fra
I dette eksempel trækker jeg også et antal sekunder fra tidsværdien.
SELECT SUBTIME('12:35:00', '1:30:30');
Resultat:
+--------------------------------+ | SUBTIME('12:35:00', '1:30:30') | +--------------------------------+ | 11:04:30 | +--------------------------------+
Og vi får det samme resultat, selvom vi udelader sekunddelen fra det indledende tidsargument.
SELECT SUBTIME('12:35', '1:30:30');
Resultat:
+-----------------------------+ | SUBTIME('12:35', '1:30:30') | +-----------------------------+ | 11:04:30 | +-----------------------------+
Eksempel 3 – Brøkdele sekunder
Du kan også trække brøksekunderdelen fra.
SELECT SUBTIME('12:35:00.888888', '1:30:30.555555');
Resultat:
+----------------------------------------------+ | SUBTIME('12:35:00.888888', '1:30:30.555555') | +----------------------------------------------+ | 11:04:30.333333 | +----------------------------------------------+
Eksempel 4 – Negative resultater
Det er ganske gyldigt at ende med en negativ værdi for dit resultat.
SELECT SUBTIME('12:35:00', '20:30:30');
Resultat:
+---------------------------------+ | SUBTIME('12:35:00', '20:30:30') | +---------------------------------+ | -07:55:30 | +---------------------------------+
Eksempel 5 – Træk fra en dato-tidsværdi
I dette eksempel trækker jeg fra en datetime-værdi (i modsætning til kun en tidsværdi som i de foregående eksempler).
SELECT SUBTIME('2021-01-01 12:35:00', '1:30:30');
Resultat:
+-------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '1:30:30') | +-------------------------------------------+ | 2021-01-01 11:04:30 | +-------------------------------------------+
I dette tilfælde var datodelen uændret, da det andet argument ikke var stort nok til at påvirke det.
I dette næste eksempel øger jeg det andet argument, så det er stort nok til at påvirke datodelen.
SELECT SUBTIME('2021-01-01 12:35:00', '100:30:30');
Resultat:
+---------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '100:30:30') | +---------------------------------------------+ | 2020-12-28 08:04:30 | +---------------------------------------------+
Som det ses i dette eksempel, er tidsværdier ikke begrænset til at være mindre end 24 timer (de kan variere fra -838:59:59 til 838:59:59 .
Du kan dog også gøre ting som dette:
SELECT SUBTIME('2021-01-01 12:35:00', '4 4:30:30');
Resultat:
+---------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '4 4:30:30') | +---------------------------------------------+ | 2020-12-28 08:04:30 | +---------------------------------------------+
Eksempel 6 – Begrænsninger af tidsværdien
Som nævnt kan tidsdatatypen variere fra -838:59:59 til 838:59:59 . Det betyder, at du ikke kan trække mere fra. Det betyder også, at resultatet ikke kan være uden for dette interval. For eksempel kan du ikke gøre dette:
SELECT SUBTIME('12:35:00', '20000000:30:30');
Resultat:
+---------------------------------------+ | SUBTIME('12:35:00', '20000000:30:30') | +---------------------------------------+ | -826:24:59 | +---------------------------------------+ 1 row in set, 1 warning (0.01 sec)
Resultatet er helt forkert, og MySQL viser en advarsel.
Men det er ikke kun det andet argument, du skal passe på. Du vil også løbe ind i det samme problem, hvis det første argument oprindeligt er en negativ værdi:
SELECT SUBTIME('-800:35:00', '50:30:30');
Resultat:
+-----------------------------------+ | SUBTIME('-800:35:00', '50:30:30') | +-----------------------------------+ | -838:59:59 | +-----------------------------------+ 1 row in set, 1 warning (0.00 sec)