답변:
사용 DATE
및CURDATE()
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
내가 추측 사용하여 DATE
여전히 INDEX를 사용합니다 .
Using where; Using index
.
timestamp
(그리고 date
내 경우처럼) MySQL의 예약어입니다
인덱스를 사용하고 쿼리가 테이블 스캔을 수행하지 않도록하려는 경우 :
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
이것이 실제 실행 계획에 미치는 차이를 보여주기 위해 SQL-Fiddle (매우 유용한 사이트)을 사용하여 테스트합니다 .
CREATE TABLE test --- simple table
( id INT NOT NULL AUTO_INCREMENT
,`timestamp` datetime --- index timestamp
, data VARCHAR(100) NOT NULL
DEFAULT 'Sample data'
, PRIMARY KEY (id)
, INDEX t_IX (`timestamp`, id)
) ;
INSERT INTO test
(`timestamp`)
VALUES
('2013-02-08 00:01:12'),
--- --- insert about 7k rows
('2013-02-08 20:01:12') ;
지금 두 가지 버전을 사용해 보겠습니다.
버전 1 DATE(timestamp) = ?
EXPLAIN
SELECT * FROM test
WHERE DATE(timestamp) = CURDATE() --- using DATE(timestamp)
ORDER BY timestamp ;
설명:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test ALL
ROWS FILTERED EXTRA
6671 100 Using where; Using filesort
그것은 모든 (6671) 행을 필터링 한 후 filesort를 (반환 된 행이 몇 가지로 그 문제가되지 않습니다) 수행
버전 2 timestamp <= ? AND timestamp < ?
EXPLAIN
SELECT * FROM test
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;
설명:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test range t_IX t_IX 9
ROWS FILTERED EXTRA
2 100 Using where
그것은 사용하는 인덱스의 범위를 스캔 한 다음 테이블 만 대응 행을 판독한다.
INDEX t_IX (timestamp, id)
있으므로 INDEX t_IX (timestamp)
일 수 있습니다 (해야합니까?) . 아니면 내가 이해하지 못하는 이유가 있습니까? 나는 sql-fiddle에서 그것을 시도하고 동일한 (더 나은) 실행 계획을 보았다
id
(PK이므로 테이블의 클러스터형 인덱스이기 때문에) 어쨌든 인덱스에 추가됩니다. 따라서 명시 적으로 추가해도 문제가되지 않습니다 (그리고 일부 옵티 마이저 사각 지대를 잡을 수 있습니다). 이 경우 / 쿼리에서는 확실히 관련이 없습니다.
timestamp < CURDATE() + INTERVAL 1 DAY
필요한지 설명 할 수 있습니까 ?
SELECT * FROM `table` WHERE timestamp >= CURDATE()
더 짧고 'AND timestamp <CURDATE () + INTERVAL 1 DAY'를 사용할 필요가 없습니다.
CURDATE ()는 항상 현재 날짜를 반환하기 때문입니다.
특정 날짜와 비교하려면 다음과 같이 직접 작성할 수 있습니다.
select * from `table_name` where timestamp >= '2018-07-07';
// 여기서 타임 스탬프는 유형이 타임 스탬프 인 열의 이름입니다.
또는
오늘 날짜를 가져 오려면 CURDATE () 함수를 사용할 수 있습니다.
select * from `table_name` where timestamp >= CURDATE();
간단히 날짜로 캐스트하십시오.
SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
또는 동일한 결과로 CURRENT_DATE 대안을 사용할 수 있습니다.
SELECT * FROM yourtable WHERE created >= CURRENT_DATE
Visual Studio 2017에서 개발을 위해 기본 제공 데이터베이스를 사용하여 현재 주어진 솔루션에 문제가 있었는데 DATE ()가 기본 제공 함수가 아니라는 오류가 발생했기 때문에 작동하도록 코드를 변경해야했습니다.
내 해결책은 다음과 같습니다.
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)