2012-08-04 14 views
35

Ich muss Daten zwischen dem ersten Tag des aktuellen Monats und dem aktuellen Tag aus der MySQL-Datenbank auswählen.Wie bekomme ich den ersten Tag des aktuellen Monats?

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

Kann jemand Arbeitsbeispiel für diese Abfrage bereitstellen?

+0

möglicherweise Referenz http://stackoverflow.com/questions/3887509/mysqls-now-1-day – Giberno

Antwort

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

Oder besser:

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

30 Subtrahierend während Datum ist der 31. gleichen Monat gibt ... – shin

+0

ur rechts @ shin – abhi

+1

Wenn "date" ein ** datetime ** ist, mussten wir DATE (date) verwenden, damit es korrekt verglichen wird. – 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

Ich war für eine ähnliche Abfrage, wo ich in meiner Anfrage am ersten Tag eines Monats zu verwenden, benötigt. Die last_day Funktion funktionierte nicht für mich, aber DAYOFMONTH kam praktisch.

Wenn also jemand nach demselben Problem sucht, gibt der folgende Code das Datum für den ersten Tag des aktuellen Monats zurück.

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

ein Datum Spalt mit dem ersten Tag des Monats Vergleich:

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

Nutzen Sie die Logik :) –

+1

Verwenden Sie [' DAY' anstelle von 'DAYOFMONTH'] (http://stackoverflow.com/a/ 28966866/632951). Verwenden Sie stattdessen die 2-Arity-Überladung von 'subdate'. Es ist schneller als das 3-artige 'date_sub'. – Pacerier

+0

Der Vorbehalt bei dieser Methode ist, dass es bricht, wenn Sie versuchen, zu vorherigen Monaten zurückzukehren, was es zu einem gefährlichen Code macht, den Sie implementieren können. Hier werden bessere und elegantere Lösungen angeboten, die an die Erweiterung anpassungsfähiger sind. – tpartee

0

Komplettlösung für mysql aktuellen Monat und im laufenden Jahr, die richtig als auch die Verwendung der Indizierung macht :)

-- 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

Ein weniger orthodoxer Ansatz könnte sein,

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

als ein Datum, das zwischen dem ersten eines Monats und jetzt gleich einem Datum ist, das in diesem Monat und vorher jetzt ist. Ich habe das Gefühl, dass dies ein bisschen leichter für die Augen ist als andere Ansätze.

2

versuchen Sie dies:

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

ich die folgende Abfrage verwendet haben. Es hat in der Vergangenheit gut für mich funktioniert.

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(); 
Verwandte Themen