현재 날짜의 타임스탬프가 있는 행을 선택하려면 어떻게 해야 합니까?
데이터베이스 테이블에서 오늘의 레코드만 선택하려고 합니다.
현재 사용하고 있다
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()는 항상 현재 날짜를 반환하기 때문입니다.
또는 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
'programing' 카테고리의 다른 글
중첩된 사전을 구현하는 가장 좋은 방법은 무엇입니까? (0) | 2023.01.13 |
---|---|
핸들바.js {{#if}} 조건부 논리 연산자 (0) | 2023.01.13 |
경고/오류 "함수 선언은 프로토타입이 아닙니다" (0) | 2023.01.13 |
개체의 첫 번째 인덱스 가져오기 (0) | 2023.01.13 |
Internet Explorer에 대해 'console'이 정의되지 않은 오류입니다. (0) | 2023.01.13 |