SQL requête qui affiche « temps il y a des dates » comme « il y a une semaine », « il y a deux semaines », « il y a un mois », « il y a un an », etc.

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

Question

Je besoin d'une requête qui affiche les dates dans le format suivant:

Les dates qui tombent au cours des 7 derniers jours -> « il y a une semaine » Les dates qui tombent dans les 7 derniers à 14 jours -> « Il y a deux semaine » Etc ...

Les dates qui tombent au cours des 30 derniers jours -> « il y a un mois » Les dates qui suivent au cours des 30 dernières à 60 jours -> « Il y a deux mois Etc ..

Les dates qui tombent au cours des 365 derniers jours -> « il y a un an » Les dates qui tombent dans les 365 derniers à 730 jours -> « il y a deux ans Etc ...

Si vous les gars peuvent me pointer vers la bonne direction, je vais l'apprécier.

Merci

Était-ce utile?

La solution

Comme indiqué ci-dessus, utilisez une déclaration de cas dans votre requête SQL. Quelque chose comme ceci:

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

Plus d'informations pour MS SQL: http://msdn.microsoft.com/ fr-fr / bibliothèque / ms181765.aspx (Ou consultez la documentation de votre marque de serveur SQL)

Autres conseils

Voici une fonction mysql j'ai écrit appelé 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 ;

Il est utilisé comme ceci

SELECT time_ago(date_ordered) time_ago FROM orders LIMIT 1

Et les regards de résultat comme celui-ci:

time_ago
22 Weeks Ago

EDIT:

Je l'ai modifié cette réponse à offrir une version améliorée de cette fonction:. Les nouvelles utilisations de la version DÉCLARE au lieu de définir des variables de session

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top