2011-01-11 22 views
11

Tengo la siguiente consulta de MySQL, y estoy tratando de ajustarla para que solo obtenga los resultados que están dentro del mes actual (del año actual), supongo que puede requerir más información sobre mi estructura de MySQL así que aquí va - Tengo una marca de tiempo UNIX generada por PHP time() almacenada dentro de la columna time (debajo de la tabla referrals), por lo que con la configuración siguiente sería t2.time.MySQL solo en el mes actual?

Así que mi problema es que no estoy seguro de cómo proceder, supongo que sería algo así como agregar lo siguiente al final de la cláusula WHERE? =>AND t2.time IS WITHIN THE CURRENT MONTH(las mayúsculas son solo para distinguir el problema del resto de la consulta) pero no estoy seguro de cómo verificar si está dentro del mes actual.

El MySQL Query:

SELECT t1.username, 
     t1.website, 
     SUM(IF(t2.type = 'in', 1, 0)) AS in_count, 
     SUM(IF(t2.type = 'out', 1, 0)) AS out_count 
FROM users AS t1 
     JOIN referrals AS t2 
     ON t1.username = t2.author 
WHERE t1.website != '' 
GROUP BY t1.username, 
      t1.website 
ORDER BY in_count DESC 
LIMIT 0, 10 

apreciar todo ayuda! : B

+0

¿sabe usted que el tipo de datos 'time' no almacena detalles de año + mes? lo que significa que su aplicación va a tener problemas para el año 2012 – ajreal

+0

@ajreal No estoy seguro de entenderlo, pero el tipo es INT dentro de la base de datos, y es una marca de tiempo UNIX generada por el tiempo de PHP(). – newbtophp

+0

así que no es el tipo de datos 'tiempo' ?, mi malo, a toda costa, evite utilizar palabras clave reservadas como columna o tabla – ajreal

Respuesta

13

puede utilizar from_unixtime como

date_format(from_unixtime(t2.`time`), '%Y-%m')=date_format(now(), '%Y-%m') 

Pero creo que el tipo de datos integer no es tan adecuado para este requisito

yo creo que el uso de datetime será más adecuado, construyó un índice en esta columna y esto también facilita el filtrado, como

t2.`time`>='2011-01-01' and t2.`time`<'2011-02-01' 

o

date_format(t2.`time`, '%Y-%m')=date_format(now(), '%Y-%m') 
2

Esto es probablemente mucho más sencillo de lo que se espera.

SELECT t1.username, 
     t1.website, 
     SUM(IF(t2.type = 'in', 1, 0)) AS in_count, 
     SUM(IF(t2.type = 'out', 1, 0)) AS out_count 
FROM users AS t1 
     JOIN referrals AS t2 
     ON t1.username = t2.author 
WHERE t1.website != '' 
     AND t2.time >= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY) 
GROUP BY t1.username, 
      t1.website 
ORDER BY in_count DESC 
LIMIT 0, 10 
-1

Compruebe esta función MONTH en MySql.

Puede agregar como condición MONTH(FROM_UNIXTIME(t2.time)) = Month(NOW())

Editado después de conseguir ayuda en los comentarios de fireeyedboy.

+0

¿No es necesario que el parámetro/argumento sea una fecha de MySQL (y no una marca de tiempo de UNIX) - (a menos que haya entendido mal o malinterpretado) la función MESETA? – newbtophp

+0

@newbtophp - Sí, tienes razón. Supongo que t2.time es un campo dateTime en mysql, de lo contrario, no hay forma de determinar el mes solo a partir del valor del tiempo. –

+1

use 'MONTH (FROM_UNIXTIME (your_timestamp))' –

66

Debe limitar los resultados usando YEAR() y MONTH()functions. Cambiar la parte WHERE de su consulta como esta:

WHERE t1.website != '' 
AND YEAR(time) = YEAR(NOW()) 
AND MONTH(time) = MONTH(NOW()) 
+0

usando esto en combinación con from_unixtime() funcionó para mí, (para obtener los datos del mes anterior) – Andrew

2
where t2.time >= extract(YEAR_MONTH from CURRENT_DATE) 
    and t2.time < extract(YEAR_MONTH from CURRENT_DATE + INTERVAL 1 MONTH) 

Esto asume t2.time es un tipo de fecha y hora. Si es una marca de tiempo Unix entera, puede convertir los límites de fecha y hora superiores que creamos, utilizando la función UNIX_TIMESTAMP().

0

Para obtener mejores resultados (-> índice de uso), cree un índice en la columna de fecha y el usuario un "entre" en su cláusula where.

select ... from my_table where my:date_field between concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01') 
and adddate(concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01'), interval 1 month); 
Cuestiones relacionadas