2010-10-20 28 views
28

No estoy seguro de por dónde empezar con este. Puede alguien ayudarme apuntar en la dirección correcta.MySQL timestamp seleccione el intervalo de fechas

que tienen una columna de marca de tiempo en MySQL y quiero seleccionar un periodo, por ejemplo, todas las marcas de tiempo que son en octubre de 2010.

Gracias.

+1

Lo sentimos, no se menciona anteriormente, es una marca de tiempo unix, no una marca de tiempo mysql. – DRKM

+0

Vi esta publicación y mi marca de tiempo funciona bien el problema al que me enfrento ahora si llamarlo con una combinación siempre devuelve cero filas devueltas ... mi consulta es así SELECCIONAR * DESDE db.t1, db.t2 DONDE t2 .t1_id = t1.id E timestamp> = '2014-06-21' Y marca de tiempo <= '2014-07-20'; –

Respuesta

35

Por lo general, sería la siguiente:

SELECT * 
    FROM yourtable 
WHERE yourtimetimefield>='2010-10-01' 
    AND yourtimetimefield< '2010-11-01' 

Pero debido a que tiene una marcas de tiempo UNIX, necesitará algo como esto:

SELECT * 
    FROM yourtable 
WHERE yourtimetimefield>=unix_timestamp('2010-10-01') 
    AND yourtimetimefield< unix_timestamp('2010-11-01') 
+0

¡Gracias! (5 caracteres más) – DRKM

+1

@merlinbeard Esto funcionaría totalmente bien con los índices ya que los valores calculados son estáticos y se pueden comparar directamente con el valor 'yourtimefield'. Ahora bien, si tuviera 'WHERE FROM_UNIXTIME (yourtimefield)> = '2010-10-01'' esto no permitiría la indexación ya que el valor de comparación con el formato de fecha tendría que calcularse para cada fila. Habiendo dicho eso. Todavía sugeriría utilizar los tipos de fecha, hora de fecha y hora en lugar de marcas de hora de Unix para la mayoría de los casos de uso. –

+0

@MikeBrant: observación correcta. Esta expresión se calcula una vez y se dobla en una constante, y aún se puede comparar con un índice en 'yourtimefield'. Inmediatamente después del comentario de Merlinbeard, recibí algunos votos hacia abajo, lo que demuestra que las personas a menudo votan sin entender por completo por qué están votando. Oye, suena a política :) –

5
SELECT * FROM table WHERE col >= '2010-10-01' AND col <= '2010-10-31' 
+0

Lo siento, debería haber mencionado que es una marca de tiempo de Unix, no una marca de tiempo mysql (información importante que se debe perder!) – DRKM

+0

Vi esta publicación y mi marca de tiempo funciona bien el problema al que me enfrento ahora si llamarlo con una combinación siempre trae cero filas devueltas –

+0

Entonces, ¿qué pasaría con los registros que tengan una marca de tiempo de '2010-10-31 09: 00: 00'? –

34

Un método compacto y flexible para las marcas de tiempo sin fracciones de segundo sería:

SELECT * FROM table_name 
WHERE field_name 
BETWEEN UNIX_TIMESTAMP('2010-10-01') AND UNIX_TIMESTAMP('2010-10-31 23:59:59') 

Si está utilizando segundos fraccionarios y una versión reciente de MySQL, entonces sería mejor tomar el enfoque de usar los operadores >= y < según Wouter's answer.

Aquí es un ejemplo de campos temporales definida con segunda precisión fraccionaria (máxima precisión en uso):

mysql> create table time_info (t_time time(6), t_datetime datetime(6), t_timestamp timestamp(6), t_short timestamp null); 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into time_info set t_time = curtime(6), t_datetime = now(6), t_short = t_datetime; 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from time_info; 
+-----------------+----------------------------+----------------------------+---------------------+ 
| 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34 | 
+-----------------+----------------------------+----------------------------+---------------------+ 
1 row in set (0.00 sec) 
+0

+1 para evitar convertir la columna para cada comparación. ¡Uno esperaría que esto fuera bastante eficiente! –

+0

@Jimbo: no, 'BETWEEN' no es realmente una buena opción aquí, porque no incluye ambos extremos. Tendrá que escribir algo así como entre '2010-10-01 00:00:00' y '2010-10-31 23:59:59' para obtener respuestas correctas, y espero que no use milisegundos . Además, el 31 de septiembre no existe, porque septiembre solo tiene 30 días. Si se quiso decir "30", entonces no es correcto porque se devolverán los datos de septiembre. En la práctica, MySQL interpreta esto como el 1 de octubre (bastante limpio), que sería correcto aquí. Aunque no estoy seguro de por qué lo escribirías el 31 de septiembre. –

+0

@WoutervanNifterick no estoy seguro exactamente de lo que estaba pasando con los valores, pero corregido. He agregado un comentario sobre el fsp ya que esto fue escrito antes de que tuvieran efecto – Cez

3

Siempre que sea posible, evitar la aplicación de funciones a una columna en la cláusula WHERE:

SELECT * 
    FROM table_name 
WHERE timestamp >= UNIX_TIMESTAMP('2010-10-01 00:00:00') 
    AND timestamp < UNIX_TIMESTAMP('2010-11-01 00:00:00'); 

Al aplicar una función a la columna de marca de tiempo (por ejemplo, FROM_UNIXTIME (timestamp) = ...) hace que la indexación sea mucho más difícil.

3

Esta consulta SQL extraerá los datos por usted. Es fácil y rápido.

SELECT * 
    FROM table_name 
    WHERE extract(YEAR_MONTH from timestamp)="201010"; 
3

puedo ver gente dando un montón de comentarios sobre esta cuestión. Pero creo que el uso simple de LIKE podría ser más fácil de obtener los datos de la tabla.

SELECT * FROM table WHERE COLUMN LIKE '2013-05-11%' 

Uso LIKE y colocar los datos de búsqueda carácter salvaje. Espero que esto solucione tu problema.

+0

¿Qué se editó? – abhijitcaps

0

Si usted tiene una marca de tiempo MySQL, algo así como 2013-09-29 22:27:10 Para ello, puede

select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9; 

Convertir a UNIX, a continuación, utilice las funciones de tiempo UNIX para extraer el mes, en este caso el 9 de septiembre.

Cuestiones relacionadas