2013-07-24 15 views
8

eseguendo l'istruzione seguente, MySQL sembra mescolare le cose:data e l'ora di datetime Getting (? Bug in MySQL)

select now(), if(false, date(now()), time(now())); 

| 2013-07-24 10:06:21 | 2010-06-21 00:00:00 | 

Se si sostituisce il secondo argomento della if con una stringa letterale, la dichiarazione si comporta correttamente:

select now(), if(false, 'Banana', time(now())); 

| 2013-07-24 10:06:21 | 10:06:21 | 

Si tratta di un bug o di qualche stranezza davvero strana?

+0

'SELEZIONA '2013-07-24 10:06:21', SE (FALSO, DATA ('2013-07-24 10:06:21'), ORA ('2013-07-24 10:06: 21 ')); 'mostra lo stesso comportamento (quindi, now() non è coinvolto) –

+0

invece,' SELECT' 2013-07-24 10:06:21 ', IF (TRUE, DATE (' 2013-07- 24 10:06:21 '), TIME (' 2013-07-24 10:06:21 ')); 'funziona correttamente come previsto –

risposta

4

Il tipo di reso di IF deve essere un tipo di dati che include i tipi di entrambi gli argomenti. Quindi se uno degli argomenti è un DATE e l'altro è un TIME, il tipo di IF sarà DATETIME.

Questo non sembra necessario nella query esempio banale, ma prendere in considerazione qualcosa di simile:

SELECT IF(col1, date(col2), time(col2)) AS dt 
FROM Table 

Tutte le righe del risultato devono avere lo stesso tipo di dati nella colonna dt, anche se i dati specifici dipenderà da cosa c'è in quella riga.

Se si desidera solo la data o l'ora, convertirlo in una stringa.

+0

Sì, devi avere ragione. Ci deve essere un tipo definito per la colonna. Quindi qual è il modo migliore per risolvere questo problema? La cosa che volevo fare era: 'selezionare se (creato forthrin

+0

Ho spiegato come farlo nell'ultima riga della mia risposta, ne hai bisogno? – Barmar

+0

Non c'è bisogno di attitudine. OK, quindi 'if (true, cast (date (now()) come char), cast (time (now()) come char))'. – forthrin