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.