2010-01-11 19 views
7

Todo,MYSQL - Recuperar marcas de tiempo entre fechas

Tengo una tabla MYSQL con una columna llamada marca de tiempo. Es del tipo de datos DATETIME y tiene valores como "10/1/2009 3:25:08 PM '," 10/1/2009 3:30:05 PM', "10/4/2009 3:40:01 PM ' , etc ..

Quiero escribir una consulta SQL para seleccionar todos los valores en el campo de occuring marca de tiempo entre dos fechas .. algo como esto:

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

las fechas userInput no tendrán porciones de tiempo. puede usted por favor sugerir la correcta sintaxis de consulta MySQL para esto? Gracias

+0

Por "es de propiedad datetime" ¿quiere decir que tiene el tipo de datos 'DATETIME'? – Quassnoi

+0

sí. eso es correcto – Jake

Respuesta

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

esto seleccionará todos los havi registro ng parte de fecha entre userStartDate y userEndDate, siempre que estos campos tengan el tipo de DATE (sin porción de tiempo).

Si las fechas de inicio y finalización venir en forma de cadenas, utilice STR_TO_DATE convertir de cualquier formato dado:

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 .. ¿Puede userStartDate tener el formato "10/01/2009"? (mm/dd/aaaa) – Jake

8
SELECT timestamp 
FROM myTable 
WHERE timestamp BETWEEN startDate AND endDate 

Para obtener los mejores resultados al utilizar BETWEEN con los valores de fecha u hora, se debe utilizar CAST() para convertir explícitamente los valores al tipo de datos deseado. Ejemplos: Si compara un DATETIME con dos valores de DATE, convierta los valores DATE en DATETIME. Si usa una constante de cadena como '2001-1-1' en comparación con DATE, envíe la cadena a DATE.

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

+1

Si tanto 'startDate' como' endDate' son '11 de enero de 2010', esto seleccionará solo registros con' timestamp = Jan 11, 2010 00: 00: 00', no todos los registros tienen ' 11 de enero' en la parte de la fecha. – Quassnoi

+0

Tienes razón, Quassnoi. Si eso es posible con los datos de los usuarios, agregue 24 horas (como lo hizo en su ejemplo). Supuse que el usuario usaría los valores de dateTime dentro de la consulta en sí. – Sampson

4

Las fechas userInput no tendrán marcas de tiempo. Puede convertir la entrada del usuario a la marca de tiempo con:

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

Su consulta puede llegar a ser:

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

Si lo que buscas para consultar un evento entre dos marcas de tiempo, para un calendario o algo donde el inicio y el final son almacenado como una marca de tiempo puede usar esto

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