SQL -Abfrage, die "vor Zeitpunkten" wie "vor einer Woche", "vor zwei Wochen", "vor einem Monat", "vor einem Jahr" usw. anzeigt, usw.
-
27-10-2019 - |
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
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.