SQL -Abfrage, die "vor Zeitpunkten" wie "vor einer Woche", "vor zwei Wochen", "vor einem Monat", "vor einem Jahr" usw. anzeigt, usw.

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

Frage

Ich brauche eine Abfrage, die Daten im folgenden Format anzeigt:

Daten, die in den letzten 7 Tagen fallen -> „Vor einer Woche“ datiert in den letzten 7 bis 14 Tagen -> „Vor zwei Woche“ usw.

Daten, die in den letzten 30 Tagen fallen -> „Vor einem Monat“ Daten, die in den letzten 30 bis 60 Tagen folgen -> „Vor zwei Monaten usw. usw.

Daten, die in den letzten 365 Tagen fallen -> „Vor einem Jahr“, die in den letzten 365 bis 730 Tagen fallen -> „Vor zwei Jahren usw. usw.

Wenn ihr mich in die richtige Richtung verweisen könnt, werde ich es schätzen.

Vielen Dank

War es hilfreich?

Lösung

Verwenden Sie, wie oben erwähnt, eine Fallanweisung in Ihrer SQL -Abfrage. Etwas wie das:

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

Weitere Informationen für MS SQL: http://msdn.microsoft.com/en-us/library/ms181765.aspx(Oder sehen Sie sich die Dokumentation für Ihre SQL Server -Marke an)

Andere Tipps

Hier ist eine MySQL -Funktion, die ich mit dem Namen time_ago geschrieben habe

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 ;

Es wird so verwendet

SELECT time_ago(date_ordered) time_ago FROM orders LIMIT 1

Und das Ergebnis sieht so aus:

time_ago
22 Weeks Ago

BEARBEITEN:

Ich habe diese Antwort geändert, um eine verbesserte Version dieser Funktion anzubieten: Die neue Version verwendet Declare, anstatt Sitzungsvariablen festzulegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top