2010-06-08 13 views
10

¿Cómo puedo obtener registros de mi tabla utilizando mes/año? Tengo una tabla como la siguiente:Seleccionar por mes de un campo

Name - varchar 
DueDate -datetime 
Status -boll 

DueDate es la fecha de vencimiento del proyecto, quiero registro correspondiente al mes/año, sin fecha completa, quiero decir récord para el mes específico.

¿Cómo puedo hacer esto en mysql?

+0

parece que todos los demás fueron más rápidos que yo al tipear! – espais

Respuesta

35

Utilice simplemente MONTH() y YEAR():

SELECT * FROM Project WHERE MONTH(DueDate) = 1 AND YEAR(DueDate) = 2010 
+5

Esto no usará un índice si existe uno en la columna 'duedate'. La respuesta de Todd R es la mejor opción. –

+0

Muy útil, ¡gracias! – tribulant

3
SELECT Name FROM Table Where MONTH(datetime) = 1; 

1 = enero.

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_month

+0

que pasa si la fecha es "1 JAN 2010" y "2 JAN 2009". de acuerdo con su consulta, encontrará ambos – Salil

+0

Hmmm .. Seguramente él puede entender que puede usar AÑO, no estoy aquí para darle la respuesta sino para guiarlo. di doblaje a la documentación para la función MES(), estoy seguro de que buscaría AÑO(), DÍA() y HORA() :) – RobertPitt

+0

Esto no usará un índice si existe uno en la columna 'duedate'. La respuesta de Todd R es la mejor opción. –

1
SELECT * WHERE MONTH(DueDate) = '5' AND YEAR(DueDate) = '1987'; 
19

Se puede usar un comunicado entre:

select * from Project 
    where DueDate between '2010-01-01' and '2010-02-01' 
+6

+1: Esto usará un índice si existe uno en la columna 'duedate'; las respuestas que usan las funciones MES Y AÑO no. –

3

se seleccionará determinado mes del año en curso

SELECT * FROM Project WHERE MONTH(DueDate) = 1 AND YEAR(DueDate) = YEAR(NOW()) 
4

No use esta solución recomendada aquí con MONTH() y YEAR(). Impide que MySQL utilice el índice en la columna DueDate si tiene uno y obliga a MySQL a examinar todas las filas en la tabla.

su lugar, utilice BETWEEN cláusula de la siguiente manera:

SELECT * FROM Project 
WHERE DueDate BETWEEN '2010-01-01' AND '2010-02-01' 

u otra solución con la cláusula IN:

SELECT * FROM Project 
WHERE DueDate IN ('2010-01-01', '2010-01-02', '2010-01-03', ..., '2010-01-31') 

Estas dos soluciones permite a MySQL a usar el índice, por lo que el rendimiento será mejor.

+3

El segundo es inútil. ¿Quién preferiría proporcionar 31 fechas en lugar de 2? –

+0

Cada función tiene sus usos. Tal vez alguien necesite seleccionar de una lista de fechas. – GeneCode

Cuestiones relacionadas