타임 스탬프 날짜를 MySQL의 날짜 전용 매개 변수와 비교하는 방법은 무엇입니까?


88

SQL 문에서 TIMESTAMP로 저장된 날짜를 YYYY-MM-DD 형식의 날짜와 어떻게 비교합니까?

전의.: SELECT * FROM table WHERE timestamp = '2012-05-05'

이 쿼리는 지정된 날짜에 타임 스탬프가있는 모든 행을 반환하지만 자정 타임 스탬프가있는 행만 반환합니다.

감사

답변:


144

DATE()함수를 사용 하여 타임 스탬프의 날짜 부분을 추출 할 수 있습니다 .

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-05'

하지만 타임 스탬프 열에 인덱스가있는 경우 타임 스탬프 열에 인덱스를 사용할 수 있기 때문에 더 빠릅니다.

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'

5
방금 실행 한 작은 테스트를 통해 BETWEEN을 사용하면 10 배 더 빠르다는 것을
알았습니다.


6

일부에서 제안했듯이 사용 DATE(timestamp)하면 열에 조작을 적용하므로 인덱스 순서에 의존 할 수 없습니다.

그러나 사용 BETWEEN은 밀리 초를 포함하는 경우에만 신뢰할 수 있습니다. 예제 타임 BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'스탬프에서는 2012-05-05 23:59:59.001과 사이의 타임 스탬프가있는 레코드를 제외합니다 2012-05-05 23:59:59.999. 그러나이 방법조차도 데이터 유형 정밀도 때문에 몇 가지 문제가 있습니다. 때때로 999 밀리 초가 반올림됩니다.

가장 좋은 방법은 다음과 같습니다.

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'

5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

2

MYSQL의 변환 기능 사용 :

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

이것은 작동합니다


1

내가 이것을 조사하면서 특정 비 정적 / 문자열 날짜에 대한 예제를 보여주기 위해 BETWEEN 솔루션을 수정하는 것이 좋을 것이라고 생각했지만 오히려 가변 날짜 또는 CURRENT_DATE(). 이것은 log_timestamp 열의 인덱스사용합니다 .

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

나는 다음날 오전 12시 사건을 피하기 위해 초 / 마이크로 초를했다. 그러나보다 독자 친화적 인 비 BETWEEN 접근 방식을 위해 비교 연산자를 통해 ʻINTERVAL '1 DAY'를 수행 할 수도 있습니다.

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

이 두 가지 방법 모두 인덱스를 사용하며 훨씬 더 빠르게 수행됩니다. 둘 다 똑같이 빠르다.


0

SQL 매개 변수를 사용하여 쿼리를 실행하는 경우 도움이 될 것입니다.

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')

0

귀하의 질문을 읽었을 때 'MySQL'태그를 볼 때까지 Oracle DB 에 있다고 생각했습니다 . 어쨌든 Oracle과 함께 일하는 사람들에게는 다음과 같은 방법이 있습니다.

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.