2012-08-04 25 views
35

Necesito seleccionar datos de la base de datos MySQL entre el 1er día del mes actual y el día actual.¿Cómo obtengo el primer día del mes actual?

select*from table_name 
where date between "1st day of current month" and "current day" 

¿Alguien puede dar un ejemplo de trabajo de esta consulta?

+0

posiblemente referencia http://stackoverflow.com/questions/3887509/mysqls-now-1-day – Giberno

Respuesta

91
select * from table_name 
where (date between DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), interval 30 day), interval 1 day) AND CURDATE()) 

O mejor:

select * from table_name 
where (date between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW()) 
+5

Restando 30, mientras que la fecha es 31 da igual mes ... – shin

+0

ur derecho @ shin – abhi

+1

Si 'date' es ** datetime **, entonces tuvimos que usar DATE (date) para que se compare correctamente. – Geoff

4
select * from table_name 
where `date` between curdate() - dayofmonth(curdate()) + 1 
       and curdate() 

SQLFiddle example

0
select * from table 
where date between 
(date_add (CURRENT_DATE, INTERVAL(1 - DAYOFMonth(CURRENT_DATE)) day)) and current_date; 
21

que estaba buscando una consulta similar donde tenía que utilizar el primer día de un mes en mi consulta. La función last_day no funcionó, pero DAYOFMONTH me resultó útil.

Si alguien está buscando el mismo problema, el siguiente código devuelve la fecha del primer día del mes actual.

SELECT DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY); 

Comparando una columna de fecha con el primer día del mes:

select * from table_name where date between 
DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY) and CURRENT_DATE 
+0

Bien uso de la lógica :) –

+1

Utilice [' DAY' en lugar de 'DAYOFMONTH'] (http://stackoverflow.com/a/ 28966866/632951). Además, use la sobrecarga de 2 arity de 'subdate' en su lugar. Es más rápido que el 3-arity 'date_sub'. – Pacerier

+0

La advertencia con este método es que se rompe si intentas volver a los meses anteriores, por lo que es una pieza peligrosa de código para implementar. Aquí se ofrecen soluciones mejores y más elegantes que son más adaptables a la extensión. – tpartee

0

solución completa para MySQL mes en curso y el año actual, que hace uso de la indexación adecuada, así :)

-- Current month 
SELECT id, timestampfield 
    FROM table1 
WHERE timestampfield >= DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY) 
    AND timestampfield <= LAST_DAY(CURRENT_DATE); 

-- Current year 
SELECT id, timestampfield 
    FROM table1 
WHERE timestampfield >= DATE_SUB(CURRENT_DATE, INTERVAL DAYOFYEAR(CURRENT_DATE)-1 DAY) 
    AND timestampfield <= LAST_DAY(CURRENT_DATE); 
-1
SET @date:='2012-07-11'; 
SELECT date_add(date_add(LAST_DAY(@date),interval 1 DAY), 
     interval -1 MONTH) AS first_day 
0

Un enfoque menos ortodoxa podría ser

SELECT * FROM table_name 
WHERE LEFT(table_name.date, 7) = LEFT(CURDATE(), 7) 
    AND table_name.date <= CURDATE(); 

como una fecha entre el primero de un mes y ahora es equivalente a una fecha en este mes, y ahora. Siento que esto es un poco más fácil para los ojos que algunos otros enfoques, sin embargo.

2

probar esto:

SET @StartDate = DATE_SUB(DATE(NOW()),INTERVAL (DAY(NOW())-1) DAY); 
SET @EndDate = ADDDATE(CURDATE(),1); 
select * from table where (date >= @StartDate and date < @EndDate); 
2

he utilizado la siguiente consulta. Me ha funcionado muy bien en el pasado.

select date(now()) - interval day(now()) day + interval 1 day 
0
SELECT date_sub(current_date(),interval dayofmonth(current_date())-1 day) as first_day_of_month; 
0
select * from <table> 
where <dateValue> between last_day(curdate() - interval 1 month + interval 1 day) 
        and curdate(); 
Cuestiones relacionadas