답변:
사용 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)