2012-08-04 40 views
35

Tôi cần chọn dữ liệu từ cơ sở dữ liệu MySQL giữa ngày đầu tiên của tháng hiện tại và ngày hiện tại.Làm cách nào để có được ngày đầu tiên của tháng hiện tại?

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

Ai đó có thể cung cấp ví dụ làm việc của truy vấn này?

+0

có thể tham khảo http://stackoverflow.com/questions/3887509/mysqls-now-1-day – Giberno

Trả lời

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

Hoặc tốt hơn:

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

Trừ 30 trong khi ngày là 31 cung cấp cho cùng một tháng ... – shin

+0

ur ngay @ shin – abhi

+1

Nếu 'date' là ** datetime ** thì chúng tôi phải sử dụng DATE (date) để làm cho nó so sánh chính xác. – 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

tôi đang tìm kiếm một truy vấn tương tự mà tôi cần phải dùng cái ngày đầu tiên của một tháng trong truy vấn của tôi. Chức năng last_day không hoạt động đối với tôi nhưng DAYOFMONTH có ích.

Vì vậy, nếu có ai đang tìm kiếm cùng một vấn đề, mã sau sẽ trả về ngày cho ngày đầu tiên của tháng hiện tại.

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

So sánh một cột ngày với ngày đầu tiên của tháng:

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

Cũng sử dụng logic :) –

+1

Sử dụng [' DAY' thay cho 'DAYOFMONTH'] (http://stackoverflow.com/a/ 28966866/632951). Ngoài ra, thay vào đó, hãy sử dụng quá tải 2 cấp độ của 'subdate'. Nó nhanh hơn 'date_sub' 3-arity. – Pacerier

+0

Thông báo trước với phương pháp này là nó sẽ bị hỏng nếu bạn cố gắng quay trở lại những tháng trước, khiến nó trở thành một đoạn mã nguy hiểm để thực hiện. Có những giải pháp tốt hơn và thanh lịch hơn được cung cấp ở đây có khả năng thích ứng hơn với phần mở rộng. – tpartee

0

giải pháp hoàn hảo cho tháng hiện tại mysql và năm nay, mà làm cho sử dụng lập chỉ mục đúng cách cũng :)

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

Cách tiếp cận ít chính thống có thể là

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

là ngày nằm trong khoảng thời gian từ ngày đầu tiên của tháng và giờ đây tương đương với ngày tháng trong tháng này và trước thời điểm này. Tôi cảm thấy rằng điều này là một chút dễ dàng hơn trên mắt so với một số phương pháp khác, mặc dù.

2

thử điều này:

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

Tôi đã sử dụng các truy vấn sau đây. Nó đã làm việc tuyệt vời cho tôi trong quá khứ.

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(); 
Các vấn đề liên quan