2010-01-11 16 views
7

Tutti,MYSQL - Recupera data/ora tra le date

Ho una tabella MYSQL con una colonna chiamata timestamp. È del tipo di dati DATETIME e ha valori come "10/1/2009 3:25:08 PM", "10/1/2009 3:30:05 PM", "10/4/2009 3:40:01 PM" , ecc ..

voglio scrivere una query SQL per selezionare tutti i valori nel campo timestamp si verificano tra due date .. qualcosa di simile:

select timestamp from tablename where timestamp >= userStartDate and timestamp <= userEndDate 

le date userinput non avranno porzioni di tempo. potete per favore suggerire la corretta sintassi MySQL Query per questo? Grazie

+0

Per "è di proprietà datetime" vuoi dire che ha il tipo di dati 'DATETIME'? – Quassnoi

+0

sì. è corretto – Jake

risposta

14
SELECT timestamp 
FROM tablename 
WHERE timestamp >= userStartDate 
     AND timestamp < userEndDate + INTERVAL 1 DAY 

questo selezionerà tutti i record havi data compresa tra userStartDate e userEndDate, a condizione che questi campi abbiano il tipo DATE (senza porzione di tempo).

se l'inizio e di fine vengono come stringhe, utilizzare STR_TO_DATE convertire da qualsiasi formato:

SELECT timestamp 
FROM tablename 
WHERE timestamp >= STR_TO_DATE('01/11/2010', '%m/%d/%Y') 
     AND timestamp < STR_TO_DATE('01/12/2010', '%m/%d/%Y') + INTERVAL 1 DAY 
+0

hmm .. Can userStartDate può essere nel formato "10/01/2009"? (mm/gg/aaaa) – Jake

8
SELECT timestamp 
FROM myTable 
WHERE timestamp BETWEEN startDate AND endDate 

Per ottenere i migliori risultati quando si utilizza BETWEEN con i valori di data o ora, si dovrebbe usare CAST() per convertire esplicitamente i valori nel tipo di dati desiderato. Esempi: se si confronta un valore DATETIME con due valori DATE, convertire i valori DATE in valori DATETIME. Se si utilizza una costante di stringa come '2001-1-1' in un confronto con un DATE, eseguire il cast della stringa su DATE.

-http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between

+1

Se sia 'startDate' che' endDate' sono 'Jan 11, 2010', questo selezionerà solo i record con' timestamp = Jan 11, 2010 00: 00: 00', non tutti i record che hanno ' 11 gennaio nella parte data. – Quassnoi

+0

Hai ragione, Quassnoi. Se ciò è possibile con i dati degli utenti, aggiungi 24 ore (come hai fatto nel tuo esempio). Avevo pensato che l'utente avrebbe usato i valori dateTime all'interno della query stessa. – Sampson

4

Le date userinput non avranno timestamp. È possibile convertire l'input dell'utente al timestamp con:

mysql> SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19'); 
     -> 1196440219 

Vostri criteri possono diventare:

select timestamp from tablename 
where timestamp >= UNIX_TIMESTAMP(userStartDate) 
and timestamp <= UNIX_TIMESTAMP(userEndDate) 
2

Se la vostra ricerca per interrogare un evento tra i due timestamp, per un calendario o qualcosa di cui l'inizio e la fine sono memorizzato come timestamp puoi usare questo

$qry = "SELECT * 
     FROM `table` 
     WHERE '$today_start' >= `event_start` 
      AND '$today_start' <= `event_end`";