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.
2012-12-28 è un'espressione aritmetica, che equivale al 1972. – Barmar