Consulta SQL que muestra "Hace Time Dats" como "Hace una semana", "Hace dos semanas", "Hace un mes", "Hace un año", etc.
-
27-10-2019 - |
Pregunta
Necesito una consulta que muestre fechas en el siguiente formato:
Las fechas que caen en los últimos 7 días -> "Una semana hace la semana" fechas que caen en los últimos 7 a 14 días -> "Hace dos semanas", etc.
Fechas que caen en los últimos 30 días -> "Hace un mes" fechas que siguen en los últimos 30 a 60 días -> "Hace dos meses, etc.
Fechas que caen en los últimos 365 días -> "Un año de hace un año" que caen en los últimos 365 a 730 días -> "Hace dos años, etc ...
Si ustedes pueden señalarme la dirección correcta, lo apreciaré.
Gracias
Solución
Como se indicó anteriormente, use una instrucción de caso en su consulta SQL. Algo como esto:
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
Más información para MS SQL: http://msdn.microsoft.com/en-us/library/ms181765.aspx(O vea la documentación de su marca SQL Server)
Otros consejos
Aquí hay una función mysql que escribí llamada Time_ago
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 ;
Se usa así
SELECT time_ago(date_ordered) time_ago FROM orders LIMIT 1
Y el resultado se ve así:
time_ago
22 Weeks Ago
EDITAR:
He modificado esta respuesta para ofrecer una versión mejorada de esta función: la nueva versión utiliza declarar en lugar de configurar variables de sesión.