mysql에서 현재 날짜 시간에서 30 일을 빼는 방법은 무엇입니까?


197

mysql의 현재 날짜 시간에서 30 일을 빼려면 어떻게합니까?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();

답변:



128

사용하지 않으려는 사람은 다음을 DATE_SUB사용하십시오 CURRENT_DATE.

SELECT CURRENT_DATE - INTERVAL 30 DAY

2
가능하면이 +10을 줄 것입니다. SQL은 가독성에 관한 것이어야하며 이것이 가장 읽기 쉬운 방법입니다.
콜린 t 하트

9
를 사용하는 것보다 더 읽기 쉽지만 결과는 다릅니다 NOW() - INTERVAL 30 DAY. 질문에 "현재 날짜 시간 에서 30 일 빼기"가 언급되었으므로 OP가 원하는 것이 아닐 수도 있습니다.
ypercubeᵀᴹ

2
@ ypercubeᵀᴹ current_timestamp대신에 사용current_date
isapir

21

NOW()쿼리 캐싱 또는 최적화가 손실 될 때마다 쿼리가 다르므로 사용하지 마십시오 . MySQL 문서 에서 사용하지 말아야 할 함수 목록을 참조하십시오 .

아래 코드에서이 테이블이 시간이 지남에 따라 커지고 있다고 가정 해 봅시다. 새로운 내용이 추가되었으며 지난 30 일 동안 만 내용을 표시하려고합니다. 가장 일반적인 경우입니다.

날짜가 문자열로 추가되었습니다. NOW()캐싱을 종료 할 때 함수 를 사용하는 것보다이 방법으로 호출 코드에서 날짜를 추가하는 것이 좋습니다 .

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

BETWEEN이 초 초에서 30 초 전부터 30 초 전까지 물건을 원한다면 사용할 수 있지만 내 경험에서 일반적인 사용 사례는 아니므로 단순화 된 쿼리가 잘 제공되기를 바랍니다.


3
그래서 당신은 사용하지 말 것을 제안 NOW()하고 여전히 당신의 대답에 사용하십시오. O_O 추신 : 반환 쿼리 다른 결과, 영업 이익은 아마 싶어하지 무엇을
zerkms

@zerkms이 쿼리는 쿼리와 다른 결과 집합을 어떻게 생성합니까?
user784637

2
@ user784637 : 음을, BETWEEN그리고 >=서로 다른 사업자, 당신은 알아요? 내 쿼리의 결과 집합 제한 30 days ago AND today이, everything after 30 days ago. 그래서 tomorrow기록이 광산 원래 쿼리와 일치하지 않습니다,하지만이 답변으로 일치합니다
zerkms

알았어. 일반적으로 이러한 쿼리는 시간이 지남에 따라 증가하는 라이브 테이블에 있습니다. 그래서 나는 그 사이를 떨어 뜨 렸습니다. 위의 답변을 명확히했습니다.
Joseph Lust

@JosephLust, 성능 문제를 해결하려면 내 솔루션을 대신 사용하십시오.
Pacerier

17

MySQL은 지금부터 며칠을 뺍니다.

select now(), now() - interval 1 day

인쇄물:

2014-10-08 09:00:56     2014-10-07 09:00:56

다른 간격 시간 표현 단위 인수 :

https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals

select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 

16

당신은 또한 사용할 수 있습니다

select CURDATE()-INTERVAL 30 DAY

1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

SQL에서 날짜 형식을 사용하여 형식을 지정할 수 있습니다.


0

또 다른 방법

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;

0

시간이 아닌 날짜 만 필요한 경우 :

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

때문에 curdate()생략합니다 시간 구성 요소, 그건 잠재적으로 보다 더 빨리 now()그리고 당신은 단지 날짜에 관심이있는 경우에 더 "의미 론적으로 올바른".

또한, subdate()2-arity 과부하가을 사용하는 것보다 빠릅니다 interval. interval하루가 아닌 구성 요소가 필요한 경우를위한 것입니다.


11
그래서, 당신 subdate(curdate(), 30)은 그것보다 더 빨리 주장하고 있습니다 CURRENT_DATE - INTERVAL 30 DAY. 증거가 있습니까? 그리고 얼마나 빠를까요? 몇 마이크로 초?
ypercubeᵀᴹ

2
나도 몰라 나는 내 의견을 반박 할 수 없다. "잠재적으로"더 빠른 주장에 대해, 나는 여전히 결정적이거나 정황적인 증거를 보지 못한다. 다소 빠르더라도 조건은 한 번 평가됩니다. 분당 백만 번 쿼리를 실행하지 않으면 차이는 중요하지 않습니다.
ypercubeᵀᴹ

2
나는 subdate잠재적으로 더 빠를 것이라고 추측합니다. 아마도 당신의 의견으로는 "2-arity overload"에 의해 설명 될 것입니다. )? 특히 "2-arity"는 무엇입니까?
Andriy M

1
또한 curdate()OP가 "현재 날짜 시간 에서 30 일을 빼기 "(강조 표시)하기를 원했기 때문에 질문의 문구에 따라 실제로 잘못된 선택 일 수 있습니다 .
Andriy M

1
@AndriyM,이 스레드는 5 만 회의 조회수를 얻으므로 시간 구성 요소에만 관심이있는 사람들을 위해 여기에 답을 남길 것입니다. 그리고 "arity"와 관련하여, 그것은 arguments의 수를 의미합니다 . 예, 맞습니다. 모든 것이 동일 할 때, 2-arity 함수는 잠재적으로 3-arity 함수보다 빠릅니다. 새로운 정보가 플레이트에 추가 될 때까지 그대로 유지됩니다.
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.