2012-12-27 12 views
10

Ho bisogno di ottenere tutti i record quelli uguali e inferiori a 2012-12-28 ho usato la seguente domanda per questo, booking_time è il campo DATETIME, e ci sono record meno di 2012-12- 28 ma restituisce zero righe. qualcuno ha idea?La funzione Mysql data non funziona per meno di

SELECT * FROM ctx_bookings WHERE DATE(booking_time)<=2012-12-28 ORDER BY id ASC 

Tabella archiviato

+---------------------+ 
| booking_time  | 
+---------------------+ 
| 2012-12-20 03:10:09 | 
| 2012-12-25 02:10:04 | 
+---------------------+ 

prega Qualcuno sa perché sta succedendo questo?

+2

2012-12-28 è un'espressione aritmetica, che equivale al 1972. – Barmar

risposta

31

avvolgere il valore con apice singolo e sicuramente funzionerà

SELECT * 
FROM ctx_bookings 
WHERE DATE(booking_time) <= '2012-12-28' 
ORDER BY id ASC 
+0

Oh..damn .. grazie amico .. –

+0

prego. ': D' –

1
SELECT * FROM ctx_bookings WHERE DATE(booking_time)<='2012-12-28' ORDER BY id ASC 

provare questo compagno

+0

Grazie amico, funziona :) –

7

Come documentato in Date and Time Literals:

MySQL riconosce DATE valori nei seguenti formati:

  • Come una stringa sia 'YYYY-MM-DD' o 'YY-MM-DD' formato. È consentita una sintassi "rilassata": qualsiasi carattere di punteggiatura può essere utilizzato come delimitatore tra le parti della data. Ad esempio, '2012-12-31', '2012/12/31', '2012^12^31' e '[email protected]@31' sono equivalenti.

  • Come una stringa senza delimitatori nel formato 'YYYYMMDD' o 'YYMMDD', a condizione che la stringa abbia senso come una data. Ad esempio, '20070523' e '070523' vengono interpretati come '2007-05-23', ma '071332' è illegale (ha parti di mese e giorno senza senso) e diventa '0000-00-00'.

  • Come numero nel formato YYYYMMDD o YYMMDD, a condizione che il numero abbia un senso come data. Ad esempio, 19830905 e 830905 vengono interpretati come '1983-09-05'.

Come @Barmar commented, la tua espressione letterale 2012-12-28 viene valutata come l'aritmetica (2012 - 12) - 28, che è uguale a 1.978.

Per @JW.'s answer, è possibile citare tale espressione per ottenere una data letterale valida (del primo modulo, sopra).In alternativa:

  • mentre citando ancora il letterale, è possibile utilizzare qualsiasi altro carattere di punteggiatura (o anche nessun carattere) come delimitatore tra le parti della data:

    WHERE DATE(booking_time) <= '2012_12_28' 
    WHERE DATE(booking_time) <= '20121228' 
    
  • è possibile rimuovere i delimitatori e lasciare il vostro letterale non quotate:

    WHERE DATE(booking_time) <= 20121228 
    

noti inoltre che l'utilizzo di un filt Questo criterio, che utilizza una funzione (in questo caso la funzione DATE()) su una colonna, richiede una scansione completa della tabella per valutare tale funzione, pertanto non trarrà alcun vantaggio da alcun indice. Un'alternativa più sargable sarebbe quella di filtrare in modo più esplicito, nella gamma dei valori della colonna (cioè volte) che soddisfano i criteri di:

WHERE booking_time < '2012-12-28' + INTERVAL 1 DAY 

Ciò equivale perché ogni volta che cade rigorosamente prima del giorno successivo sarà necessariamente si sono verificati prima o durante il giorno di interesse. È sargabile perché la colonna viene confrontata con un'espressione costante (il risultato dell'operazione + è deterministico) e pertanto un indice su booking_time può essere attraversato per trovare immediatamente tutti i record corrispondenti.