SQL -запрос, который показывает «даты назад», как «Год недели назад», «две недели назад», «Год назад», «Год назад» и т. Д.
-
27-10-2019 - |
Вопрос
Мне нужен запрос, который отображает даты в следующем формате:
Даты, которые упали за последние 7 дней -> «Неделя назад» даты, которые упали за последние 7-14 дней -> «две недели назад» и т. Д.
Даты, которые упали за последние 30 дней -> «месяц назад» даты, которые следуют за последние 30-60 дней -> «два месяца назад и т. Д.
Даты, которые осенью за последние 365 дней -> «Год назад» даты, которые упали за последние 365 до 730 дней -> «два года назад и т. Д.
Если вы, ребята, можете указать мне в правильном направлении, я признателен.
Спасибо
Решение
Как указано выше, используйте оператор CASE в своем запросе SQL. Что-то вроде этого:
SELECT
Column1,
Column2,
theDate,
CASE
WHEN DATEDIFF(dd, theDate, GetDate()) =< 7 THEN 'One Week Ago'
WHEN DATEDIFF(dd, theDate, GetDate()) > 7 AND DATEDIFF(dd, theDate, GetDate()) < 30 THEN 'One Month Ago'
-- ...
END
AS TimeAgo,
Column3,
Column4
FROM Table1
Более подробная информация для MS SQL: http://msdn.microsoft.com/en-us/library/ms181765.aspx(Или увидеть документацию для вашего бренда SQL Server)
Другие советы
Вот функция MySQL, которую я написал
DELIMITER $$
DROP FUNCTION IF EXISTS time_ago;
CREATE FUNCTION time_ago (ts datetime)
RETURNS varchar(255)
DETERMINISTIC
BEGIN
DECLARE utx INT SIGNED DEFAULT 1;
DECLARE nowutx INT SIGNED DEFAULT 1;
DECLARE dif INT SIGNED DEFAULT 1;
DECLARE method varchar(255);
DECLARE cnt varchar(255);
DECLARE plural tinyint(11);
DECLARE future tinyint(11);
SET utx := UNIX_TIMESTAMP(ts);
SET nowutx := UNIX_TIMESTAMP(NOW());
SET future := utx > nowutx;
SET dif := IF(future, utx - nowutx, nowutx - utx);
SET method := IF(dif < 60, 'Second', IF(
dif < (60 * 60), 'Minute', IF(
dif < (60 * 60 * 24), 'Hour', IF(
dif < (60 * 60 * 24 * 7), 'Day' , IF(
dif < (60 * 60 * 24 * 365), 'Week', 'Year')))));
SET cnt := IF(dif < 60, dif, IF(
dif < (60 * 60), floor(dif / 60), IF(
dif < (60 * 60 * 24), floor(dif / (60 * 60)), IF(
dif < (60 * 60 * 24 * 7), floor(dif / (60 * 60 * 24)) , IF(
dif < (60 * 60 * 24 * 365) , floor(dif / (60 * 60 * 24 * 7)), floor(dif / (60 * 60 * 24 * 365)))))));
SET plural := cnt != 1;
return CONCAT(IF(future, 'In ', ''), cnt, ' ',method, IF(plural, 's', '') , IF(future, ' From Now', ' Ago'));
END$$
DELIMITER ;
Это используется таким
SELECT time_ago(date_ordered) time_ago FROM orders LIMIT 1
И результат выглядит так:
time_ago
22 Weeks Ago
РЕДАКТИРОВАТЬ:
Я изменил этот ответ, чтобы предложить улучшенную версию этой функции: новая версия использует Declare вместо установки переменных сеанса.