#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 ;