programing

현재 날짜의 타임스탬프가 있는 행을 선택하려면 어떻게 해야 합니까?

goodsources 2023. 1. 13. 19:55
반응형

현재 날짜의 타임스탬프가 있는 행을 선택하려면 어떻게 해야 합니까?

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

현재 사용하고 있다

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

하지만 이 작업은 지난 24시간 동안 진행되었으며, 시간을 무시하고 오늘부터 결과만 선택해야 합니다.날짜만 기준으로 결과를 선택하려면 어떻게 해야 합니까?

사용하다DATE그리고.CURDATE()

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

경고! 이 쿼리는 인덱스를 효율적으로 사용하지 않습니다.보다 효율적인 솔루션에 대해서는, 이하의 회답을 참조해 주세요.

데모에서 실행 계획 참조

인덱스를 사용하고 쿼리를 테이블 스캔을 수행하지 않으려면 다음을 수행합니다.

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

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) 행을 필터링한 후 파일 정렬을 수행합니다(반환되는 행이 적기 때문에 문제 없습니다).


의 버전 2

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 타임스탬프 <CURDATE() + INTERVAL 1 DAY'를 사용할 필요가 없습니다.

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

MySQL CURDATE() 함수

또는 CURRENT_DATE를 사용하여 동일한 결과를 얻을 수 있습니다.

SELECT * FROM yourtable WHERE created >= CURRENT_DATE

데이터베이스의 예.안내

특정 날짜와 비교할 경우 다음과 같이 직접 쓸 수 있습니다.

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

// 여기서 timestamp는 type을 timestamp로 하는 열의 이름입니다.

또는

오늘 날짜를 가져오는 경우 CURDATE() 함수를 사용할 수 있습니다.

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

이것이 가장 쉬운 방법이라고 생각합니다.

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

날짜를 지정하기만 하면 됩니다.

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

우리가 이 고양이의 가죽을 벗길 수 있는 방법은 몇 가지입니까?여기 또 다른 변종이 있습니다.

선택 * 시작table여기서 날짜(From_UNIXTIME)timestamp)) = '2015-11-18';

Visual Studio 2017에서 개발용 내장 데이터베이스를 사용하여 현재 주어진 솔루션에서 문제가 발생했는데, DATE()가 내장 함수가 아니라는 오류가 발생하여 코드를 변경해야 했습니다.

저의 솔루션은 다음과 같습니다.

where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)

SELECT * FROM table WHERE FROM_UNIXTIME(your_column_with_unix_time,'%Y-%m-%d') = CURDATE()

언급URL : https://stackoverflow.com/questions/14769026/how-to-select-rows-that-have-current-days-timestamp

반응형