V MySQL můžete použít SUBTIME()
funkce k odečtení hodnoty času od výrazu času nebo data a času.
Funguje to tak, že poskytnete dva argumenty; první je hodnota času nebo data a času a druhá je hodnota času. SUBTIME()
funkce pak odečte druhý argument od prvního a vrátí výsledek.
Syntaxe
Syntaxe vypadá takto:
SUBTIME(expr1,expr2)
Kde expr1
může být výraz čas nebo datum a čas a expr2
je časový výraz.
A tak expr2
se odečte od expr1
.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
SELECT SUBTIME('12:35:00', '1:30');
Výsledek:
+-----------------------------+ | SUBTIME('12:35:00', '1:30') | +-----------------------------+ | 11:05:00 | +-----------------------------+
Příklad 2 – Odečítání sekund
V tomto příkladu také odečítám počet sekund od hodnoty času.
SELECT SUBTIME('12:35:00', '1:30:30');
Výsledek:
+--------------------------------+ | SUBTIME('12:35:00', '1:30:30') | +--------------------------------+ | 11:04:30 | +--------------------------------+
A dostaneme stejný výsledek, i když vynecháme sekundovou část z počátečního časového argumentu.
SELECT SUBTIME('12:35', '1:30:30');
Výsledek:
+-----------------------------+ | SUBTIME('12:35', '1:30:30') | +-----------------------------+ | 11:04:30 | +-----------------------------+
Příklad 3 – zlomky sekund
Můžete také odečíst část ve zlomcích sekund.
SELECT SUBTIME('12:35:00.888888', '1:30:30.555555');
Výsledek:
+----------------------------------------------+ | SUBTIME('12:35:00.888888', '1:30:30.555555') | +----------------------------------------------+ | 11:04:30.333333 | +----------------------------------------------+
Příklad 4 – Negativní výsledky
Skončit se zápornou hodnotou pro váš výsledek je docela platné.
SELECT SUBTIME('12:35:00', '20:30:30');
Výsledek:
+---------------------------------+ | SUBTIME('12:35:00', '20:30:30') | +---------------------------------+ | -07:55:30 | +---------------------------------+
Příklad 5 – Odečtení od hodnoty data a času
V tomto příkladu odečítám od hodnoty datetime (na rozdíl od pouhé hodnoty času jako v předchozích příkladech).
SELECT SUBTIME('2021-01-01 12:35:00', '1:30:30');
Výsledek:
+-------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '1:30:30') | +-------------------------------------------+ | 2021-01-01 11:04:30 | +-------------------------------------------+
V tomto případě se část data nezměnila, protože druhý argument nebyl dostatečně velký, aby to ovlivnil.
V tomto dalším příkladu zvětším druhý argument tak, aby byl dostatečně velký, aby ovlivnil část data.
SELECT SUBTIME('2021-01-01 12:35:00', '100:30:30');
Výsledek:
+---------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '100:30:30') | +---------------------------------------------+ | 2020-12-28 08:04:30 | +---------------------------------------------+
Jak je vidět v tomto příkladu, časové hodnoty nejsou omezeny na méně než 24 hodin (mohou se pohybovat od -838:59:59 na 838:59:59 .
Můžete však také dělat věci jako toto:
SELECT SUBTIME('2021-01-01 12:35:00', '4 4:30:30');
Výsledek:
+---------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '4 4:30:30') | +---------------------------------------------+ | 2020-12-28 08:04:30 | +---------------------------------------------+
Příklad 6 – Omezení časové hodnoty
Jak již bylo zmíněno, typ časových dat se může pohybovat od -838:59:59 na 838:59:59 . To znamená, že nemůžete odečíst více než to. To také znamená, že výsledek nemůže být mimo tento rozsah. Nemůžete například udělat toto:
SELECT SUBTIME('12:35:00', '20000000:30:30');
Výsledek:
+---------------------------------------+ | SUBTIME('12:35:00', '20000000:30:30') | +---------------------------------------+ | -826:24:59 | +---------------------------------------+ 1 row in set, 1 warning (0.01 sec)
Výsledek je zcela chybný a MySQL zobrazí varování.
Ale není to jen druhý argument, na který si musíte dát pozor. Na stejný problém narazíte také v případě, že první argument je zpočátku záporná hodnota:
SELECT SUBTIME('-800:35:00', '50:30:30');
Výsledek:
+-----------------------------------+ | SUBTIME('-800:35:00', '50:30:30') | +-----------------------------------+ | -838:59:59 | +-----------------------------------+ 1 row in set, 1 warning (0.00 sec)