За последние 24 часа нас посетили 22802 программиста и 1262 робота. Сейчас ищут 725 программистов ...

Арифметические операции с временем

Тема в разделе "MySQL", создана пользователем Ondottr, 19 май 2018.

Метки:
  1. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Если в БД две записи со временем в TIMESTAMP
    Первая запись - сейчас(+- 5 минут)
    Вторая - до 7 дней назад
    Нужно от первого времени отнять второе и узнать разницу в формате %дней, %часов, %минут, %секунд

    Сделал вот такое, но этот запрос выводит разницу не больше суток то есть если разница в 36 часов, будет писать 12

    PHP:
    1. $sql = mysql_query("SELECT TIME_TO_SEC('$date') - TIME_TO_SEC('$d') AS 'interval in seconds'", $link);
    2.                     while ($result = mysql_fetch_array($sql)) {
    3.                         $_ = $result['interval in seconds'];
    4.          
    5.          
    6.             $days = intval($_/86400);
    7.             if($days != 0) {
    8.                 echo $days, ' д. ';
    9.             }
    10.             $hours = intval(($_-$days*86400)/3600);
    11.             if($hours != 0) {
    12.                 echo $hours, ' ч. ';
    13.             }
    14.             $min = intval(($_-$days*86400-$hours*3600)/60);
    15.             if($min != 0) {
    16.                 echo $min, ' мин. ';
    17.             }
    18.             $sec = intval($_-$days*86400-$hours*3600-$min*60);
    19.             if($sec != 0) {
    20.                 echo $sec, ' с. ';
    21.             }
    22.             echo $results['report'], '<div class="sep"></div>';
    23.                     }
    Был еще один вариант с помощью БД, но тут скорее всего что-то я недопонимаю... потому что это не работает совсем...

    PHP:
    1. CREATE  PROCEDURE get_my_time (
    2.     time VARCHAR(20)) BEGIN DECLARE beg TIMESTAMP; DECLARE ends TIMESTAMP; DECLARE INTERVAL DOUBLE PRECISION; DECLARE hours INT; DECLARE mins INT; DECLARE sec INT;
    3. SELECT
    4.     datetime INTO beg,
    5.     datetim INTO ends
    6. FROM
    7.     reports
    8. WHERE
    9.     id = 29;
    10. INTERVAL = beg - ends;
    11.    IF (INTERVAL < 0) THEN INTERVAL = -INTERVAL;
    12.    INTERVAL = INTERVAL*24;
    13.    IF (CAST(INTERVAL AS INT) > INTERVAL) THEN hours = INTERVAL - 1; ELSE hours = INTERVAL;
    14.    INTERVAL = (INTERVAL - hours)*60;
    15.    IF (CAST(INTERVAL AS INT) > INTERVAL) THEN mins = INTERVAL - 1; ELSE mins = INTERVAL;
    16.    sec = (INTERVAL - mins)*60;
    17.    IF (sec = 60) THEN sec = 59;
    18.    _time = hours || ':' || CASE WHEN mins>10 THEN mins ELSE '0' || mins END || ':' || CASE WHEN sec>10 THEN sec ELSE '0' || sec END;
    19.    suspend;
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну так сначала отними а потом переводи в дата
     
  3. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    не понял...
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    TIME_TO_SEC берет только время без даты
    Вот их с бд достань отними и переводи
     
  5. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    SELECT TIME_TO_SEC('$date') - TIME_TO_SEC('$d')
    $date - это первое значение со временем
    $d - второе

    Знаю что дату не учитывает, поэтому и спрашиваю как можно сделать по другому
     
  6. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну если знаешь тогда зачем мучишься тем более если у тебя там действительно TIMESTAMP. Выбираешь запись. Отнимаешь от первого второе и все. Если там дата тоже самое есть strtotime. Или переводи все в дата. Или просто убери TIME_TO_SEC и отнимай в sql
    PHP:
    1. $datetime1 = new DateTime('2009-10-11 10:10');
    2. $datetime2 = new DateTime('2009-10-13 09:12');
    3. $interval = $datetime1->diff($datetime2);
    4. echo $interval->format("%D:%H:%I:%S");
    --- Добавлено ---
    https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestampdiff или вот так как то
     
    #6 nospiou, 20 май 2018
    Последнее редактирование: 20 май 2018
    Ondottr нравится это.
  7. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Спасибо:)
    не подскажешь еще как сделать чтобы время выводилось так:
    02 д. 49 мин. 13 сек.
    вместо этого: 02 д. 00 ч. 49 мин. 13 сек.
     
  8. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Разобрался, еще раз спасибо