2016-05-29 33 views
5

Ho una tabella come questa:data classificandoli come "ieri", "la settimana scorsa", ecc

// 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 

Ho anche questa domanda:

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 

E qui è uscita in corrente:

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

Come vedete la mia domanda seleziona tutte quelle unix-volte sbagliato. Perché e come posso risolverlo?

Ecco risultato atteso:

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

Il codice funziona (ad esempio) in SQL Fiddle: http://www.sqlfiddle.com/#!9/e63fd/3. Il codice non è corretto a causa della terza condizione, ma produce l'output previsto. –

+0

Il timestamp è rilevante solo fino al giorno DATE, che probabilmente non è molto interessante. Rimuovilo dalla domanda per un problema/ambito chiarito. – user2864740

+0

@ user2864740 Non capisco cosa intendi .. –

risposta

3

Presumibilmente, la logica che si desidera è come questo:

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; 

Note:

  • Non v'è alcuna ragione per estrarre la data.
  • Le frasi in un'istruzione case vengono eseguite in sequenza, quindi il primo corrispondente restituirà un valore.
  • Se il codice originale non funziona, anche questo potrebbe fallire. Il tuo codice originale non avrebbe dovuto restituire solo "ieri".
  • range è una parola riservata, quindi è necessario eseguire l'escape.

Here è l'SQL Fiddle.

+0

Grazie, +1 ..! Quando chiedo una domanda del database, sto aspettando una risposta da te .. per favore fallo sempre così :-) * (scrivendo una risposta per me) * –

+0

La partita di ieri era perché la sua data (oggi) era una corrispondenza esatta to curdate() - 1 i criteri dei casi per "ieri". tieni presente che l'ora di unix è in UTC, negli Stati Uniti per diverse ore. CURDATE() - 1 è la nostra data 'oggi' – EoinS

2

Il problema è che si arent il controllo di una serie per la settimana sulla terza condizione. Significato ...

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

FIDDLE

Attualmente il codice sta dicendo WHEN CURDATE() - INTERVAL 7 DAY THEN 'in last week' se la data è pari a 7 giorni fa SOLO. il 25 non è il 22, quindi fallisce quel controllo. È necessario specificare un intervallo per farlo funzionare.

+0

Anche il tuo violino funziona e ti ringrazio +1. Solo il risultato del mio locale è diverso .. Non so davvero perché, dovrei cambiare qualcosa come MySQL-time? Perché penso che non sia impostato correttamente. –

+0

@Stack è possibile selezionare CURDATE() per vedere quale data MySQL si sta ottenendo. Potrebbe essere la tua configurazione disattivata. –

+0

anche gordons fiddle non funziona completamente perché non controlla un intervallo sul condizionale :) –