복붙노트

[SQL] 어떻게 현재 날짜의 소인이있는 행을 선택하려면?

SQL

어떻게 현재 날짜의 소인이있는 행을 선택하려면?

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

현재 내가 사용

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

그러나 이것은 지난 24 시간 동안 결과를 받아, 나는 그것은 단지 시간을 무시하고, 오늘부터 결과를 선택해야합니다. 어떻게 일 만에 따라 결과를 선택할 수 있습니까?

해결법

  1. ==============================

    1.사용 날짜와 CURDATE ()

    사용 날짜와 CURDATE ()

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

    나는 DATE를 사용하는 것은 여전히 ​​INDEX를 사용 같아요.

    데모의 실행 계획을 참조

  2. ==============================

    2.당신이 원하는 경우 인덱스가 사용되는 쿼리는 테이블 스캔을 할 수 없습니다 :

    당신이 원하는 경우 인덱스가 사용되는 쿼리는 테이블 스캔을 할 수 없습니다 :

    WHERE timestamp >= CURDATE()
      AND timestamp < CURDATE() + INTERVAL 1 DAY
    

    이 실제 실행 계획을 만드는 차이를 보여주기 위해, 우리는 SQL-바이올린 (매우 도움이되는 사이트)를 테스트합니다 :

    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') ;
    

    이제 2 버전을 시도 할 수 있습니다.

    DATE (타임 스탬프)와 버전 1 =?

    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를 (반환 된 행이 몇 가지로 그 문제가되지 않습니다) 수행

    타임 스탬프 <=와 버전이? 및 타임 스탬프

    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
    

    이 인덱스의 범위 스캔을 사용하고 테이블 만 대응 행을 판독한다.

  3. ==============================

    3.

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

    소용해야 'AND 소인

    CURDATE 때문에 ()는 항상 현재 일 반환

    MySQL의 CURDATE () 함수

  4. ==============================

    4.얼마나 많은 방법 우리는이 고양이를 피부 할 수 있습니까? 여기에 또 다른 변종이다.

    얼마나 많은 방법 우리는이 고양이를 피부 할 수 있습니까? 여기에 또 다른 변종이다.

    테이블 SELECT * WHERE DATE (FROM_UNIXTIME (소인)) = '2015년 11월 18일';

  5. ==============================

    5.단순히 날짜에 캐스팅 :

    단순히 날짜에 캐스팅 :

    SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
    
  6. ==============================

    6.이것은 내 생각에 가장 쉬운 수 :

    이것은 내 생각에 가장 쉬운 수 :

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

    7.특정 날짜와 비교하려는 경우, 당신은 직접처럼 쓸 수 있습니다 :

    특정 날짜와 비교하려는 경우, 당신은 직접처럼 쓸 수 있습니다 :

    select * from `table_name` where timestamp >= '2018-07-07';
    

    // 여기에 타임 스탬프는 타임 스탬프 형식을 갖는 열의 이름입니다

    또는

    오늘 날짜를 가져 오는 경우, CURDATE () 함수는 그렇게 볼 수 있습니다 :

    select * from `table_name` where timestamp >=  CURDATE();
    
  8. ==============================

    8.아니면 같은 결과는 CURRENT_DATE 대안을 사용할 수 있습니다 :

    아니면 같은 결과는 CURRENT_DATE 대안을 사용할 수 있습니다 :

    SELECT * FROM yourtable WHERE created >= CURRENT_DATE
    

    database.guide의 사례

  9. ==============================

    9.사용하여 비주얼 스튜디오 2017에 내장 된 I 현재 주어진 솔루션에 대한 문제가 있었다 개발을위한 데이터베이스, 나는 DATE ()는 함수에 내장되지 않았 음 오류를 던졌다 때문에 작동하도록 코드를 변경했다.

    사용하여 비주얼 스튜디오 2017에 내장 된 I 현재 주어진 솔루션에 대한 문제가 있었다 개발을위한 데이터베이스, 나는 DATE ()는 함수에 내장되지 않았 음 오류를 던졌다 때문에 작동하도록 코드를 변경했다.

    여기 내 솔루션입니다 :

    여기서, CAST (TimeCalled AS DATE) = (DATE AS GETDATE ()) CAST

  10. from https://stackoverflow.com/questions/14769026/how-to-select-rows-that-have-current-days-timestamp by cc-by-sa and MIT license