2016-05-29 10 views
5

Ich habe eine Tabelle wie folgt Klassifizieren Datum:als "gestern", "letzte Woche", etc

// mytable 
+----+------------+ 
| id | date_time | 
+----+------------+ 
| 1 | 1464136759 | -- 5 days ago 
| 2 | 1464436759 | -- 2 days ago 
| 3 | 1464538248 | -- 6 hours ago 
+----+------------+ 
--     ^these are based on current time which is 1464561158 

Auch ich habe diese Anfrage:

SELECT id, CASE DATE(FROM_UNIXTIME(date_time)) 
      WHEN CURDATE() THEN 'today' 
      WHEN CURDATE() - INTERVAL 1 DAY THEN 'yesterday' 
      WHEN CURDATE() - INTERVAL 7 DAY THEN 'in last week' 
      ELSE 'in last month or more' 
      END range 
FROM mytable 
WHERE 1 

Und hier ist Stromausgang:

+----+---------------+ 
| id |  range  | 
+----+---------------+ 
| 1 | in last month | 
| 2 | in last month | 
| 3 | yesterday  | 
+----+---------------+ 

Wie Sie meine Frage sehe wählt alle diese Unix-mal falsch. Warum und wie kann ich es reparieren?

Hier ist erwartete Ausgabe:

+----+--------------+ 
| id | range  | 
+----+--------------+ 
| 1 | in last week | 
| 2 | yesterday | 
| 3 | today  | 
+----+--------------+ 
+0

Ihr Code funktioniert (wie es ist) in SQL Fiddle: http://www.sqlfiddle.com/#!9/e63fd/3. Der Code ist wegen der dritten Bedingung nicht korrekt, aber es produziert die erwartete Ausgabe. –

+0

Der Zeitstempel ist nur bis zum DATE relevant, was wahrscheinlich nicht sehr interessant ist. Entfernen Sie es aus der Frage für ein geklärt Problem/Bereich. – user2864740

+0

@ user2864740 Ich verstehe nicht, was meinst du .. –

Antwort

3

Vermutlich die Logik, die Sie wollen, ist wie folgt:

SELECT id, 
     (CASE WHEN FROM_UNIXTIME(date_time) >= CURDATE() THEN 'today' 
      WHEN FROM_UNIXTIME(date_time) >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN 'yesteray' 
      WHEN FROM_UNIXTIME(date_time) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) THEN 'in last week' 
      ELSE 'in last month or more' 
     END) as `range` 
FROM mytable 
WHERE 1; 

Hinweise:

  • Es gibt keinen Grund, das Datum zu extrahieren.
  • Die Klauseln in einer case Anweisung werden nacheinander ausgeführt, sodass die erste übereinstimmende Anweisung einen Wert zurückgibt.
  • Wenn der ursprüngliche Code fehlschlägt, kann dies ebenfalls fehlschlagen. Dein ursprünglicher Code sollte nicht nur "gestern" zurückgegeben haben.
  • range ist ein reserviertes Wort, daher muss es maskiert werden.

Here ist die SQL-Fiddle.

+0

Danke, +1 ..! Wenn ich eine Datenbank-Frage stelle, warte ich auf eine Antwort von dir .. bitte tu das immer :-) * (schreib mir eine Antwort) * –

+0

Das gestrige Match war, weil sein Date (heute) genau passierte curdate() - 1 die Fallkriterien für "gestern". Beachten Sie, dass die Unix-Zeit in UTC ist, in den USA für mehrere Stunden. curdate() - 1 ist unser "heute" -Datum – EoinS

2

Das Problem ist, die auf dem dritten Zustand einen Bereich für die Woche Arent überprüfen. Bedeutung ...

DATE(FROM_UNIXTIME(date_time)) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() - INTERVAL 1 DAY 

FIDDLE

Aktuell Ihr Code sagt WHEN CURDATE() - INTERVAL 7 DAY THEN 'in last week', wenn das Datum vor zu 7 Tagen gleich NUR. der 25. ist nicht der 22., also versagt es. Sie müssen einen Bereich angeben, damit er funktioniert.

+0

Ihre Geige funktioniert auch und danke +1. Nur das Ergebnis von meinem lokalen ist anders .. Ich weiß wirklich nicht warum, sollte ich etwas wie MySQL-Zeit ändern? Weil ich denke, dass es nicht richtig eingestellt ist. –

+0

@Stack Sie können CURDATE() auswählen, um zu sehen, welches MySQL-Datum Sie erhalten. Es könnte sein, dass deine Konfiguration ausgeschaltet ist. –

+0

auch Gordons Geige funktioniert nicht vollständig, weil es nicht auf einen Bereich auf der bedingten überprüft :) –

Verwandte Themen