W MySQL możesz użyć SUBTIME() funkcja odejmowania wartości czasu od wyrażenia czasu lub daty i godziny.
Działa to tak, że podajesz dwa argumenty; pierwsza to wartość czasu lub daty i godziny, a druga to wartość czasu. SUBTIME() funkcja następnie odejmuje drugi argument od pierwszego i zwraca wynik.
Składnia
Składnia wygląda tak:
SUBTIME(expr1,expr2)
Gdzie expr1 może być wyrażeniem czasu lub daty i godziny, a expr2 jest wyrażeniem czasu.
I tak expr2 jest odejmowane od expr1 .
Przykład 1 – Podstawowe użycie
Oto przykład do zademonstrowania.
SELECT SUBTIME('12:35:00', '1:30');
Wynik:
+-----------------------------+
| SUBTIME('12:35:00', '1:30') |
+-----------------------------+
| 11:05:00 |
+-----------------------------+
Przykład 2 – Odejmowanie sekund
W tym przykładzie odejmuję również liczbę sekund od wartości czasu.
SELECT SUBTIME('12:35:00', '1:30:30');
Wynik:
+--------------------------------+
| SUBTIME('12:35:00', '1:30:30') |
+--------------------------------+
| 11:04:30 |
+--------------------------------+
I otrzymujemy ten sam wynik, nawet jeśli pominiemy część sekund w początkowym argumencie czasu.
SELECT SUBTIME('12:35', '1:30:30');
Wynik:
+-----------------------------+
| SUBTIME('12:35', '1:30:30') |
+-----------------------------+
| 11:04:30 |
+-----------------------------+
Przykład 3 – ułamki sekund
Możesz także odjąć część ułamków sekund.
SELECT SUBTIME('12:35:00.888888', '1:30:30.555555');
Wynik:
+----------------------------------------------+
| SUBTIME('12:35:00.888888', '1:30:30.555555') |
+----------------------------------------------+
| 11:04:30.333333 |
+----------------------------------------------+
Przykład 4 – Wyniki negatywne
Całkiem słuszne jest otrzymanie ujemnej wartości wyniku.
SELECT SUBTIME('12:35:00', '20:30:30');
Wynik:
+---------------------------------+
| SUBTIME('12:35:00', '20:30:30') |
+---------------------------------+
| -07:55:30 |
+---------------------------------+
Przykład 5 – Odejmowanie od wartości daty i godziny
W tym przykładzie odejmuję od wartości daty i godziny (w przeciwieństwie do tylko wartości czasu, jak w poprzednich przykładach).
SELECT SUBTIME('2021-01-01 12:35:00', '1:30:30');
Wynik:
+-------------------------------------------+
| SUBTIME('2021-01-01 12:35:00', '1:30:30') |
+-------------------------------------------+
| 2021-01-01 11:04:30 |
+-------------------------------------------+
W tym przypadku część daty pozostała niezmieniona, ponieważ drugi argument nie był wystarczająco duży, aby na nią wpłynąć.
W następnym przykładzie zwiększam drugi argument, aby był wystarczająco duży, aby wpłynąć na datę.
SELECT SUBTIME('2021-01-01 12:35:00', '100:30:30');
Wynik:
+---------------------------------------------+
| SUBTIME('2021-01-01 12:35:00', '100:30:30') |
+---------------------------------------------+
| 2020-12-28 08:04:30 |
+---------------------------------------------+
Jak widać w tym przykładzie, wartości czasu nie są ograniczone do mniej niż 24 godzin (mogą wynosić od -838:59:59 do 838:59:59 .
Możesz też robić takie rzeczy:
SELECT SUBTIME('2021-01-01 12:35:00', '4 4:30:30');
Wynik:
+---------------------------------------------+
| SUBTIME('2021-01-01 12:35:00', '4 4:30:30') |
+---------------------------------------------+
| 2020-12-28 08:04:30 |
+---------------------------------------------+
Przykład 6 – Ograniczenia czasu Wartość
Jak wspomniano, typ danych czasu może wynosić od -838:59:59 do 838:59:59 . Oznacza to, że nie możesz nic więcej odjąć. Oznacza to również, że wynik nie może być poza tym zakresem. Na przykład nie możesz tego zrobić:
SELECT SUBTIME('12:35:00', '20000000:30:30');
Wynik:
+---------------------------------------+
| SUBTIME('12:35:00', '20000000:30:30') |
+---------------------------------------+
| -826:24:59 |
+---------------------------------------+
1 row in set, 1 warning (0.01 sec)
Wynik jest całkowicie błędny i MySQL wyświetla ostrzeżenie.
Ale to nie tylko drugi argument, na który musisz uważać. Ten sam problem napotkasz również, jeśli pierwszy argument ma początkowo wartość ujemną:
SELECT SUBTIME('-800:35:00', '50:30:30');
Wynik:
+-----------------------------------+
| SUBTIME('-800:35:00', '50:30:30') |
+-----------------------------------+
| -838:59:59 |
+-----------------------------------+
1 row in set, 1 warning (0.00 sec)