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


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.