Время с момента обновления запроса MySQL

#mysql

#MySQL

Вопрос:

У меня есть таблица, полная временных меток, подобных 2011-10-05 08:09:00.000 этому, запрашивается приведенным ниже запросом, ссылающимся на reg_date, mid_date, pre_date. Вместо отображения метки времени мне нужно, чтобы она отображалась 23 mins ago вместо 2011-10-05 08:09:00.000 . Я пробовал некоторые функции, такие как timediff() и format() . Я хотел бы завершить все это в запросе, чтобы мне не приходилось запрашивать и обрабатывать результаты.

Возможно, я не очень хорошо понимаю руководство, но я уверен, что есть способ выполнить это. Я действительно новичок в MySQL query statement. Однако я вижу большой потенциал и экономию времени. Мне просто нужна небольшая помощь, чтобы выполнить это.

 select reg_price as regPrice, _id as ID, lat, lng, reg_date as regDate, 
                mid_date as midDate, pre_date as preDate, 
                format((acos(sin(radians(39.9891)) * sin(radians(lat))   cos(radians(39.9891)) *
                cos(radians(lat)) * cos(radians(-82.8116) - radians(lng))) * 6378),1)
                as distance from stationDetails where (acos(sin(radians(39.9891)) 
                * sin(radians(lat))   cos(radians(39.9891)) * cos(radians(lat)) * 
                cos(radians(-82.8116) - radians(lng))) * 6378) <= 3 order by reg_price asc, reg_price asc
  

Комментарии:

1. Отображение даты и времени в формате ago является очень общим — нет «одного» способа сделать это. Вы хотите, чтобы это всегда было в минутах? В минутах / часах? минуты / часы / дни / месяцы / годы? Смоделировано после StackOverflow? Как вы определяете, когда отображать какой формат и как его отображать?

2. Я не знаю, какой серверный язык вы используете, но вот простое решение на PHP: mdj.us/web-development/php-programming /…

3. Оно будет определяться исходя из текущего времени на сервере, поэтому он может использовать now() . Мне нужно, чтобы оно отображалось примерно так, как 3 day 2 hrs 2 mins 23 secs извините, что не включил это в исходное сообщение.

4. Что было не так с ответом на ваш другой вопрос?

Ответ №1:

Используя TIMEDIFF() и TIME_FORMAT() , вы должны иметь возможность отображать результаты, подобные X минут назад. Это должно быть легко изменить для других значений времени по мере необходимости, в зависимости от того, как вы хотите работать с различными временными шкалами (часы, дни и т.д.):

 select
    TIME_FORMAT(
        TIMEDIFF(now(), dt)
        ,'%i minute(s) ago'
    )
from Data;
  

Демонстрация: http://sqlize.com/r1mlXcM62V

Ответ №2:

Это функция, которая была создана для временного интервала, аналогичного SOF.

 DELIMITER $$

DROP FUNCTION IF EXISTS `GetTimeDisplay2` $$

CREATE FUNCTION `GetTimeDisplay2` (GivenTimestamp TIMESTAMP)

RETURNS VARCHAR(32)

DETERMINISTIC

BEGIN    

    DECLARE rv VARCHAR(32);

    DECLARE diff BIGINT;    

    SET diff = UNIX_TIMESTAMP()-UNIX_TIMESTAMP(GivenTimestamp);

        IF diff < 0 THEN

        SET rv = CONCAT(abs(diff/60),' From Now');

    END IF;

    IF diff = 0 THEN

        SET rv = 'Just Now';

    END IF;

    IF diff = 1 THEN

        SET rv = '1 sec ago';

    END IF;

    IF diff BETWEEN 2 AND 60 THEN

        SET rv = CONCAT(FORMAT(diff, 0), ' secs ago');

    END IF;

    IF diff BETWEEN 120 AND 3599 THEN

        SET rv = CONCAT(FORMAT(diff/60, 0), ' mins ago');

    END IF;

    IF diff BETWEEN 61 AND 119 THEN

        SET rv = CONCAT(FORMAT(diff/60, 0), ' min ago');

    END IF;

    IF diff = 3600 THEN

        SET rv = CONCAT(FORMAT(diff/3600, 0), ' hr ago');

    END IF;

    IF diff BETWEEN 3601 AND 86399 THEN

        SET rv = CONCAT(FORMAT(diff/3600, 0), ' hrs ago');

    END IF;

    IF diff > 86400 THEN

        SET rv = DATE_FORMAT(GivenTimestamp, '%a %l:%i %p');

    END IF;

    IF diff > 259200 THEN

        SET rv = DATE_FORMAT(GivenTimestamp, '%b %e at %l:%i %p');

    END IF;

    RETURN rv;

END $$

DELIMITER ;