[mysql] 오늘의 타임 스탬프가있는 행을 선택하는 방법은 무엇입니까?

데이터베이스 테이블에서 오늘의 레코드 만 선택하려고합니다.

현재 나는

SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));

그러나 이것은 지난 24 시간 동안의 결과를 필요로하며 시간을 무시하고 오늘의 결과 만 선택하는 데 필요합니다. 날짜만을 기준으로 결과를 선택하려면 어떻게해야합니까?



답변

사용 DATECURDATE()

SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()

내가 추측 사용하여 DATE 여전히 INDEX를 사용합니다 .

데모에서 실행 계획보기


답변

인덱스를 사용하고 쿼리가 테이블 스캔을 수행하지 않도록하려는 경우 :

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

그것은 사용하는 인덱스의 범위를 스캔 한 다음 테이블 만 대응 행을 판독한다.


답변

SELECT * FROM `table` WHERE timestamp >= CURDATE()

더 짧고 ‘AND timestamp <CURDATE () + INTERVAL 1 DAY’를 사용할 필요가 없습니다.

CURDATE ()는 항상 현재 날짜를 반환하기 때문입니다.

MySQL CURDATE () 함수


답변

이 고양이를 얼마나 많은 방법으로 피부를 벗길 수 있습니까? 여기에 또 다른 변형이 있습니다.

SELECT * FROM tableWHERE DATE (FROM_UNIXTIME ( timestamp)) = ‘2015-11-18’;


답변

특정 날짜와 비교하려면 다음과 같이 직접 작성할 수 있습니다.

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)


답변

이것은 내 의견으로는 가장 쉬울 수 있습니다.

SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');