I MySQL kan du använda SUBTIME()
funktion för att subtrahera ett tidsvärde från ett uttryck för tid eller datum och tid.
Hur det fungerar är att du ger två argument; det första är ett värde för tid eller datum och det andra är ett tidsvärde. SUBTIME()
funktion subtraherar sedan det andra argumentet från det första och returnerar resultatet.
Syntax
Syntaxen ser ut så här:
SUBTIME(expr1,expr2)
Där expr1
kan vara antingen ett tid- eller datumuttryck, och expr2
är ett tidsuttryck.
Och så expr2
subtraheras från expr1
.
Exempel 1 – Grundläggande användning
Här är ett exempel att visa.
SELECT SUBTIME('12:35:00', '1:30');
Resultat:
+-----------------------------+ | SUBTIME('12:35:00', '1:30') | +-----------------------------+ | 11:05:00 | +-----------------------------+
Exempel 2 – Subtrahera sekunder
I det här exemplet subtraherar jag också ett antal sekunder från tidsvärdet.
SELECT SUBTIME('12:35:00', '1:30:30');
Resultat:
+--------------------------------+ | SUBTIME('12:35:00', '1:30:30') | +--------------------------------+ | 11:04:30 | +--------------------------------+
Och vi får samma resultat även om vi utelämnar sekunddelen från det initiala tidsargumentet.
SELECT SUBTIME('12:35', '1:30:30');
Resultat:
+-----------------------------+ | SUBTIME('12:35', '1:30:30') | +-----------------------------+ | 11:04:30 | +-----------------------------+
Exempel 3 – Bråkdelar av sekunder
Du kan också subtrahera delen av bråkdelssekunder.
SELECT SUBTIME('12:35:00.888888', '1:30:30.555555');
Resultat:
+----------------------------------------------+ | SUBTIME('12:35:00.888888', '1:30:30.555555') | +----------------------------------------------+ | 11:04:30.333333 | +----------------------------------------------+
Exempel 4 – Negativa resultat
Det är ganska giltigt att sluta med ett negativt värde för ditt resultat.
SELECT SUBTIME('12:35:00', '20:30:30');
Resultat:
+---------------------------------+ | SUBTIME('12:35:00', '20:30:30') | +---------------------------------+ | -07:55:30 | +---------------------------------+
Exempel 5 – Subtrahera från ett datum/tidsvärde
I det här exemplet subtraherar jag från ett datetime-värde (i motsats till bara ett tidsvärde som i de tidigare exemplen).
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 det här fallet var datumdelen oförändrad, eftersom det andra argumentet inte var tillräckligt stort för att påverka det.
I nästa exempel ökar jag det andra argumentet så att det är tillräckligt stort för att påverka datumdelen.
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 framgår av det här exemplet är tidsvärdena inte begränsade till att vara mindre än 24 timmar (de kan variera från -838:59:59 till 838:59:59 .
Men du kan också göra sådant här:
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 | +---------------------------------------------+
Exempel 6 – Begränsningar av tidsvärdet
Som nämnts kan tidsdatatypen variera från -838:59:59 till 838:59:59 . Det betyder att du inte kan dra av mer än så. Det betyder också att resultatet inte kan ligga utanför detta intervall. Du kan till exempel inte göra detta:
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 är helt fel och MySQL visar en varning.
Men det är inte bara det andra argumentet du måste vara försiktig med. Du kommer också att stöta på samma problem om det första argumentet initialt är ett negativt värde:
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)