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)