MySQL은 오늘과 같은 날짜 선택


96

오늘 날짜를보고 당일에 등록한 결과 만 반환하는 mysql select 문을 실행하려고합니다. 현재 다음을 시도했지만 작동하지 않는 것 같습니다.

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE()

나는 SELECT이것에 대한 진술을 수정했습니다 . 감사합니다.

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()


그것은 signup_datedatetime 필드 인 것 같습니다
Sergii

@Serjio 예, 현재 날짜 시간 필드입니다.
Jako

signup_date시간이 포함 된 경우 데이터 유형은 무엇입니까? WHERE절 에서 date_format을 사용 하여 시간을 제거하여CURDATE()
Taryn

@bluefeet 감사합니다. 스크립트를 수정했습니다. 작동하는 것 같지만 결과가 없을 때. mysql_num_rows0을 표시하지 않습니다. 그냥 공백입니다.
Jako

답변:


197
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()

필드가 날짜 유형 인 경우에도 DATE ()를 사용해야합니까?
rashidnk

2
@rashidnk 아니요. 질문에서 명확하게 말하지는 않았지만 필드는 분명히 유형 DATETIME입니다.
Barmar

2
이 솔루션은 절대적으로 정확하지만 제대로 확장되지는 않습니다 ( signup_date해당 인덱스가 있더라도 에서 인덱스를 사용할 수 없음 ). Serjio의 솔루션을 선호 하십시오 .
RandomSeed

또는 특정 날짜를 찾으려면 인덱스도 활용되는```SELECT users.id, DATE_FORMAT (users.signup_date, '% Y- % m- % d') from users where signup_date> = '2017-08 -30 00:00:00 '및 signup_date <='2017-08-30 23:59:59 '; ```
Sumit M Asok

3
@SumitMAsok < '2017-08-31 00:00:00'밀리 초로 MySQL 버전을 사용하는 경우 사용하는 것이 좋습니다.
Barmar 2017-10-26

29

이 쿼리는 signup_date필드에 인덱스가있는 경우 인덱스를 사용 합니다.

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)

이 답변에 대한 반대 투표는 터무니 없습니다. 이 쿼리 signup_date는 다른 접근 방식과 달리 에서 인덱스를 활용할 수 있기 때문에 실제로 선호되는 접근 방식입니다.
RandomSeed

2
@RandomSeed signup_date두 시간 사이 에 테스트하는 일반적인 아이디어 는 정확하지만 시간은 그렇지 않습니다. 현재 날짜 00:00와 사이 여야합니다 23:59:59.
Barmar

날짜 간격도 잘못되었습니다>. <결국 비추천 투표는 그렇게 터무니 없지 않았습니다.
RandomSeed

이 쿼리는 인덱스로 인해 훨씬 ​​더 성능이 좋습니다. 는 WHERE DATE(signup_date) = CURDATE()여기 한 0.8 밀리 ~ 50 밀리 내 서버를했다.
Kai Noack

13

에 서식을 추가해야하는 것 WHERE같습니다.

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE()

데모로 SQL Fiddle 보기


1

CONCATwith CURDATE()를 하루 중 전체 시간 동안 사용한 다음 BETWEENin WHERE조건 을 사용하여 필터링 할 수 있습니다 .

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.