No MySQL, você pode usar o
SUBTIME()
função para subtrair um valor de hora de uma expressão de hora ou data e hora. A maneira como funciona é que você fornece dois argumentos; o primeiro é um valor de hora ou data e hora e o segundo é um valor de hora. O
SUBTIME()
A função então subtrai o segundo argumento do primeiro e retorna o resultado. Sintaxe
A sintaxe fica assim:
SUBTIME(expr1,expr2)
Onde
expr1
pode ser uma expressão de hora ou data e hora e expr2
é uma expressão de tempo. E assim
expr2
é subtraído de expr1
. Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar.
SELECT SUBTIME('12:35:00', '1:30');
Resultado:
+-----------------------------+ | SUBTIME('12:35:00', '1:30') | +-----------------------------+ | 11:05:00 | +-----------------------------+
Exemplo 2 – Subtraindo segundos
Neste exemplo, também subtraio um número de segundos do valor de tempo.
SELECT SUBTIME('12:35:00', '1:30:30');
Resultado:
+--------------------------------+ | SUBTIME('12:35:00', '1:30:30') | +--------------------------------+ | 11:04:30 | +--------------------------------+
E obtemos o mesmo resultado mesmo se omitirmos a parte dos segundos do argumento de tempo inicial.
SELECT SUBTIME('12:35', '1:30:30');
Resultado:
+-----------------------------+ | SUBTIME('12:35', '1:30:30') | +-----------------------------+ | 11:04:30 | +-----------------------------+
Exemplo 3 – Segundos fracionários
Você também pode subtrair a parte dos segundos fracionários.
SELECT SUBTIME('12:35:00.888888', '1:30:30.555555');
Resultado:
+----------------------------------------------+ | SUBTIME('12:35:00.888888', '1:30:30.555555') | +----------------------------------------------+ | 11:04:30.333333 | +----------------------------------------------+
Exemplo 4 – Resultados negativos
É bastante válido acabar com um valor negativo para o seu resultado.
SELECT SUBTIME('12:35:00', '20:30:30');
Resultado:
+---------------------------------+ | SUBTIME('12:35:00', '20:30:30') | +---------------------------------+ | -07:55:30 | +---------------------------------+
Exemplo 5 - Subtrair de um valor de data e hora
Neste exemplo, subtraio de um valor de data e hora (em oposição a apenas um valor de hora, como nos exemplos anteriores).
SELECT SUBTIME('2021-01-01 12:35:00', '1:30:30');
Resultado:
+-------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '1:30:30') | +-------------------------------------------+ | 2021-01-01 11:04:30 | +-------------------------------------------+
Nesse caso, a parte da data não foi alterada, pois o segundo argumento não era grande o suficiente para afetá-la.
Neste próximo exemplo, eu aumento o segundo argumento para que seja grande o suficiente para afetar a parte da data.
SELECT SUBTIME('2021-01-01 12:35:00', '100:30:30');
Resultado:
+---------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '100:30:30') | +---------------------------------------------+ | 2020-12-28 08:04:30 | +---------------------------------------------+
Como visto neste exemplo, os valores de tempo não estão restritos a menos de 24 horas (eles podem variar de -838:59:59 para 838:59:59 .
No entanto, você também pode fazer coisas assim:
SELECT SUBTIME('2021-01-01 12:35:00', '4 4:30:30');
Resultado:
+---------------------------------------------+ | SUBTIME('2021-01-01 12:35:00', '4 4:30:30') | +---------------------------------------------+ | 2020-12-28 08:04:30 | +---------------------------------------------+
Exemplo 6 – Limitações do valor do tempo
Conforme mencionado, o tipo de dados de tempo pode variar de -838:59:59 para 838:59:59 . Isso significa que você não pode subtrair mais do que isso. Isso também significa que o resultado não pode estar fora desse intervalo. Por exemplo, você não pode fazer isso:
SELECT SUBTIME('12:35:00', '20000000:30:30');
Resultado:
+---------------------------------------+ | SUBTIME('12:35:00', '20000000:30:30') | +---------------------------------------+ | -826:24:59 | +---------------------------------------+ 1 row in set, 1 warning (0.01 sec)
O resultado está completamente errado e o MySQL exibe um aviso.
Mas não é apenas o segundo argumento que você precisa ter cuidado. Você também encontrará o mesmo problema se o primeiro argumento for inicialmente um valor negativo:
SELECT SUBTIME('-800:35:00', '50:30:30');
Resultado:
+-----------------------------------+ | SUBTIME('-800:35:00', '50:30:30') | +-----------------------------------+ | -838:59:59 | +-----------------------------------+ 1 row in set, 1 warning (0.00 sec)