MySQL SELECT WHERE datetime은 요일과 일치합니다 (반드시 시간은 아님)


127

datetime 열이 포함 된 테이블이 있습니다. 시간에 관계없이 주어진 날짜의 모든 기록을 반환하고 싶습니다. 즉, 내 테이블에 다음 4 개의 레코드 만 포함 된 경우 2012-12-25로 ​​제한하면 두 번째와 세 번째 레코드 만 반환됩니다.

2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00

답변:


326

절대로 다음 과 같은 선택기를 사용하지 마십시오DATE(datecolumns) = '2012-12-24' .

  • DATE()일치하지 않는 행을 포함하여 모든 행 을 계산 합니다.
  • 쿼리에 인덱스를 사용할 수 없게됩니다.

사용하는 것이 훨씬 빠릅니다

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'

이것은 계산없이 인덱스 사용을 허용하기 때문입니다.

편집하다

Used_By_Already가 지적한 바와 같이 2012 년 초기 답변 이후로 '23 : 59 : 59 '를 하루 종일 사용하는 것이 더 이상 안전하지 않은 MySQL 버전이 등장했습니다. 업데이트 된 버전은 읽어야합니다.

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'

대답의 요점, 즉 계산 된 표현에서 선택자를 피하는 것은 물론 여전히 유효합니다.


나는 a1ex07의 솔루션이 다른 것만 큼 좋지 않은 것 같다고 언급하려고했습니다. 게시물을 읽은 후 생각을 뒤집어 야 할 수도 있습니다!
user1032531 dec.

2
두 대의 서버에서 방금 테스트 한 결과, 특히 거대한 테이블의 경우 date () = ''보다 훨씬 빠릅니다 (적어도 10 배 이상). 감사합니다
zzapper 2014-08-19

1
@KonradViltersten 나는 쿼리를 더 읽기 쉽게 만들고 내 요점을 끌어 들이기 위해 매우 장황한 방법을 사용했습니다. a1ex07의 대답에는 희소 구문이 있습니다.
Eugen Rieck 2014-08-27

9
@KonradViltersten-더 나은 아직 : WHERE col >= '2012-12-25' AND col < '2012-12-25' + INTERVAL 1 DAY. 그것은 0 시간을 방지하고 작동 DATE, DATETIME, DATETIME(6), 등 등 도약 일,와 거래
릭 제임스

1
'2012-12-25 23:59:59'는 하루의 끝으로 유효하지 않습니다. 항상 나쁜 생각이었고 1 초 미만의 시간 정밀도를 지원하는 MySQL 버전에 버그가 발생합니다. 훨씬 나아 릭 제임스 (이상) 또는 a1ex07 (다른 대답)에 의해 접근 방식을 사용하는
Used_By_Already

34

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'잠재적으로 더 잘 작동 할 수 있습니다 (date_column에 인덱스가있는 경우) DATE.


1
나는 실제로 무엇이 더 빠른지 궁금합니다-이것 또는 BETWEEN해결책 ... 누구 bechmarked?
jave.web

6
차이가 없어야합니다. BETWEEN작성하는 방법 field >= value1 and fied<= value2입니다.
a1ex07 2015

1
MySQL 매뉴얼에 따르면 "BETWEEN을 날짜 또는 시간 값과 함께 사용할 때 최상의 결과를 얻으려면 CAST ()를 사용하여 값을 원하는 데이터 유형으로 명시 적으로 변환하십시오. 예 : DATETIME을 두 개의 DATE 값과 비교하는 경우 DATE를 변환하십시오. 값을 DATETIME 값으로 변경합니다. DATE에 대한 비교에서 '2001-1-1'과 같은 문자열 상수를 사용하는 경우 문자열을 DATE로 캐스트하십시오. " 따라서 모두 동일한 유형이 아니라면 명시 적으로 캐스팅하는 것이 가장 좋습니다.
techdude

21

다음을 사용할 수 있습니다 %.

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'

13
LIKE는 DATE (datetimecol)만큼 느린 것 같습니다. Eugen 또는 a1ex07의 솔루션을 더 잘 사용하십시오.
Marie Fischer

3
항상 속도에 관한 것은 아닙니다. 그래서 저는이 솔루션을 좋아합니다. 훨씬 더 읽기 쉽습니다.
Simon Hansen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.