2016-05-29 25 views
5

Mam tabeli jak poniżej:datę Klasyfikowanie jako "wczoraj", "ostatniego tygodnia", 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 

Również mam tej kwerendy:

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 

A oto prąd wyjściowy:

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

Jak widzisz moje pytanie wybiera wszystkie te błędne czasy uniksowe. Dlaczego i jak mogę to naprawić?

Oto oczekiwany wynik:

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

Twój kod działa (tak jak jest) w Fiddle SQL: http://www.sqlfiddle.com/#!9/e63fd/3. Kod jest nieprawidłowy z powodu trzeciego warunku, ale generuje oczekiwany wynik. –

+0

Znacznik czasu ma znaczenie tylko do i do daty DATE, co prawdopodobnie nie jest zbyt interesujące. Usuń go z pytania, aby uzyskać wyjaśniony problem/zakres. – user2864740

+0

@ user2864740 Nie rozumiem, co masz na myśli .. –

Odpowiedz

3

Można przypuszczać, że logika, że ​​chcesz to tak:

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; 

Uwagi:

  • Nie ma powodu, aby wyodrębnić datę.
  • Klauzule w instrukcji case są wykonywane kolejno, więc pierwsza zgodna zwróci wartość.
  • Jeśli oryginalny kod ulegnie uszkodzeniu, może to również zakończyć się niepowodzeniem. Twój oryginalny kod nie powinien był zwracać tylko "wczoraj".
  • range jest słowem zastrzeżonym, więc musi zostać zmienione.

Here to skrzypce SQL.

+0

Dziękuję, +1 ..! Kiedy pytam o bazę danych, czekam na odpowiedź od Ciebie .. proszę zawsze rób to :-) * (pisanie odpowiedzi dla mnie) * –

+0

Wczorajszy mecz był, ponieważ jego data (dzisiaj) była dokładnym dopasowaniem do curdate() - 1 kryteria przypadku dla "wczoraj". pamiętaj, że czas unix jest w UTC, w USA przez kilka godzin curdate() - 1 to nasza "dzisiejsza" data – EoinS

2

Problem jest z ciebie sprawdzając zasięg na tydzień na trzeci warunek. Czyli ...

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

FIDDLE

Obecnie kod mówi WHEN CURDATE() - INTERVAL 7 DAY THEN 'in last week' jeżeli data jest równa 7 dni temu TYLKO. 25. nie jest 22., więc nie sprawdza tego. Musisz określić zakres, aby uruchomić go.

+0

Twoje skrzypce działa również i dziękuję +1. Tylko wynik mojego lokalnego jest inny ... Naprawdę nie wiem dlaczego, czy powinienem zmienić coś w stylu MySQL? Ponieważ myślę, że nie jest ustawiony prawidłowo. –

+0

@Stack można wybrać CURDATE(), aby zobaczyć, co dostajesz datę MySQL. Może to być twoja konfiguracja jest wyłączona. –

+0

również gordons fiddle nie działa całkowicie, ponieważ nie sprawdza zasięgu warunkowego :) –