Consulta SQL que muestra "Hace Time Dats" como "Hace una semana", "Hace dos semanas", "Hace un mes", "Hace un año", etc.

StackOverflow https://stackoverflow.com/questions/7323883

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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top