Mysql SUBTIME (время (конец), время (начало)), дающее отрицательное значение - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь вычислить длительность от начального до конечного времени, поэтому я использую запрос SUBTIME(TIME(end_time), TIME(start_time)) as duration, который хорошо работает, когда и start_time, и end_time находятся в одном и том же дне.

Вот код для создания MRE:

create table mre(
  id int,
  start_time datetime,
  end_time datetime,
  desired VARCHAR(40)
);

insert into mre (id, start_time, end_time, desired)
values 
  (1, "2019-10-10 23:59:59", "2019-10-11 00:01:01", "no"),
  (2, "2019-10-10 22:11:11", "2019-10-10 23:11:11", "yes"),
  (3, "2019-10-10 11:00:59", "2019-10-10 13:43:01", "yes"),
  (4, "2019-10-10 23:57:59", "2019-10-11 00:00:01", "no");

, поэтому теперь, когда я запускаю

select 
  *,
  subtime(time(end_time), time(start_time)) as duration
from mre;

Он выводит

   id        start_time           end_time    desired   duration
    1   2019-10-10 23:59:59 2019-10-11 00:01:01 no      -23:58:58
    2   2019-10-10 22:11:11 2019-10-10 23:11:11 yes     01:00:00
    3   2019-10-10 11:00:59 2019-10-10 13:43:01 yes     02:42:02
    4   2019-10-10 23:57:59 2019-10-11 00:00:01 no      -23:57:58

Первая строка начинается с 2019-10-10, но заканчивается на 2019-10-11. Если вы посмотрите на время, разница между ними должна быть 00:01:02, что я и хочу.

, но вместо этого она дает мне 00:01:01 - 23:59:59 = -23:58:58.

переключение мест в end_time и start_time не имеет смысла (я попробовал на всякий случай).

Кто-нибудь может помочь?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Я только что понял, что это потому, что внутри функции subtime я обертываю end_time и start_time с помощью TIME (), поэтому он игнорирует даты.

Поэтому я попытался сделать это без TIME (), которые дают нулевые значения для столбца продолжительности.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020
select 
  *,
  TIMEDIFF(end_time, start_time) as duration
from mre;

или

select 
  *,
  SEC_TO_TIME(TIMESTAMPDIFF(SECOND, start_time, end_time)) as duration
from mre;

fiddle

Если duration превышает 838: 59: 59 (35 дней), то оно будет усечено до этого значение (ограничение типа данных TIME).

0 голосов
/ 07 февраля 2020

Я только что понял, что имя SUBTIME содержит «TIME», что, вероятно, говорит о том, что оно учитывает только время, поэтому мне потребовалось перенести время в Time () и выдало нулевое значение, когда я пытался вставить объект datetime.

Благодаря https://www.w3resource.com/mysql/date-and-time-functions/mysql-timediff-function.php Я понял, что если вы хотите учитывать и дату при расчете длительности, вам нужно использовать функцию TIMEDIFF ().

Я не нашел ТАК вопрос по этому вопросу (возможно, слишком простой), поэтому я решил оставить его открытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...