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)