전월의 모든 행을 가져 오는 쿼리


90

지난달에 생성 된 데이터베이스의 모든 행을 선택해야합니다.

예를 들어, 현재 월이 1 월이면 12 월에 생성 된 모든 행을 반환하고 2 월이면 1 월에 생성 된 모든 행을 반환하려고합니다. date_created데이터베이스에 다음 형식으로 생성 된 날짜를 나열 하는 열이 2007-06-05 14:50:17있습니다..

답변:


198
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

70
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
Ghazanfar 미르

12
@GhazanfarMir 귀하의 쿼리는 질문과 일치하지 않지만 위의 답변은 일치합니다. Yours는 지난달부터 어제까지의 행을 반환합니다.
Matt Passell 2014 년

@MattPassell 죄송하지만 between경계가 포함되어 있습니다 .. 현재 날짜도 포함됩니다. 어제로 제한되는 이유 / 어떻게 ?? 자세히 설명해주세요.
Ghazanfar Mir 2014 년

4
무슨 뜻인지 알 겠어요 .. 네 말이 맞아요 .. 내 질문이 OP가 원했던 것이 아닙니다 .. 질문을 오해했습니다
Ghazanfar Mir 2014-01-30

어떤 경우에 대한 current_date오늘날하지만 클라이언트에서 주어진 임의의 날짜 아닌가요?
dios231

22

또 다른 대안이 있습니다. 인덱스 DATE또는 DATETIME형식 필드 가 있다고 가정하면 형식이 지정된 날짜가 인덱스가 사용되기 전에 형식이 변환되므로 인덱스를 사용해야합니다. 그러면 EXPLAIN으로 볼 때 range쿼리가 아닌 index쿼리가 표시됩니다 .

SELECT
    * 
FROM
    table
WHERE 
    date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) 
AND
    date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' )

+1. 훨씬 더 친숙한 색인. 항상 날짜 객체를 다루도록 STR_TO_DATE주위를 던질 수도 있습니다 DATE_FORMAT.
Leigh

14

미래 날짜가없는 경우 ...

SELECT * 
FROM   table_name 
WHERE  date_created > (NOW() - INTERVAL 1 MONTH);

테스트되었습니다.


3
나는 그들이 뭔가 다른 것을 찾고 있다고 생각합니다. 즉, 지난달의 모든 레코드 (예 : 2012 년 10 월 1 일-2012 년 10 월 31 일 23:59:59). 위의 쿼리는 오늘 날짜 및 시간 에서 지난 30 일 정도를 반환합니다 .
Leigh

13

다른 방법에 hobodave의 대답

SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

YEAR_MONTH를 단위로 사용하여 EXTRACT로 동일한 결과를 얻을 수 있으므로 다음과 같이 AND가 필요하지 않습니다.

SELECT * FROM table
WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
1 MONTH)

이것은 몇 달 동안 훌륭하게 작동하지만 불행히도 YEAR_WEEK 시간 간격 이 없으므로 몇 달이 아닌 몇 주가 필요한 경우 hobodave의 답변으로 돌아 가야합니다.
Danny Beckett

8
SELECT *
FROM  yourtable
where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')

이것은 지난 30 일 또는 31 일 동안의 기록과는 반대로 지난달의 모든 기록을 반환해야합니다.


언급하는 것을 잊었습니다. 이것은 지난 30 일 또는 31 일 동안의 기록과는 반대로 지난달의 모든 기록을 반환합니다.
그레그

제 생각에 이것은 받아 들여진 대답보다 간단하지만 동일한 결과를 제공하기 때문에 받아 들여진 대답이어야합니다
Grant

3

이 질문에 대한 답은 이미 선택되었지만 가장 간단한 쿼리는

SELECT * 
FROM table 
WHERE 
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();

2
아뇨. @hobodave에 의해 주어진 대답에 귀하의 의견에 대한 내 대답을 참조하십시오
매트 Passell

@MattPassell 당신이 맞아요, 질문을 오해했습니다 .. 결과가 지난 달의 기록에만 국한되어야한다는 점을 놓쳤습니다.
Ghazanfar Mir 2014 년

2
WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
  AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY) 

이것은 나를 위해 일했습니다 (이번 달에 쿼리를 실행 한 날짜에 관계없이 지난달에 생성 된 모든 레코드 선택)


1

select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');

이것은 필드 값에 변환 함수를 적용하지 않기 때문에 date_created가 인덱싱되면 인덱스를 활용할 수 있습니다.


@ggiroux-LIKE를 적용하기 전에 날짜를 문자 유형으로 변환해야합니다.
martin clayton

네 사실,하지만 여전히 선택한 답변 이럴에 비해 개선이 (IFF DATE_CREATED이 색인)
ggiroux

1

다음은 지난 달의 레코드를 가져 오는 쿼리입니다.

SELECT *
FROM `tablename`
WHERE `datefiled`
BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH )
AND 
LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH ) )

감사합니다-saqib


해당 쿼리를 실행 해 보셨습니까? 내가 보는 한, 이전 달의 모든 날짜를 선택하지는 않지만 (예 : 1 월의 2 월 전체 데이터 반환), 한 달 전 같은 날 시작하는 범위의 데이터를 반환합니다
Nico Haase

0

단일 조건이있는 대안

SELECT * FROM table
WHERE YEAR(date_created) * 12 + MONTH(date_created)
    = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1

-1
SELECT *  FROM table  
WHERE  YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

해당 쿼리를 실행 해 보셨습니까? 내가 보는 한, 이전 달의 모든 날짜를 선택하지는 않지만 (예 : 1 월의 2 월 전체 데이터 반환), 한 달 전 같은 날 시작하는 범위의 데이터를 반환합니다
Nico Haase

나는 약간의 변경을했다, 지금 그것이 작동하는지 확인한다
sid busa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.