Jac*_*son 93 mysql sql timestamp
我试图从数据库表中只选择今天的记录.
目前我用
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Run Code Online (Sandbox Code Playgroud)
但这需要过去24小时的结果,我需要它只选择今天的结果,忽略时间.如何仅根据日期选择结果?
Joh*_*Woo 171
使用DATE和CURDATE()
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
Run Code Online (Sandbox Code Playgroud)
我猜使用DATE 仍然使用INDEX.
ype*_*eᵀᴹ 51
如果要使用索引并且查询不进行表扫描:
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
Run Code Online (Sandbox Code Playgroud)
为了显示这对实际执行计划的不同,我们将使用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') ;
Run Code Online (Sandbox Code Playgroud)
让我们现在尝试2个版本.
版本1与 DATE(timestamp) = ?
EXPLAIN
SELECT * FROM test
WHERE DATE(timestamp) = CURDATE() --- using DATE(timestamp)
ORDER BY timestamp ;
Run Code Online (Sandbox Code Playgroud)
说明:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test ALL
ROWS FILTERED EXTRA
6671 100 Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)
它过滤所有(6671)行然后执行文件排序(这不是问题,因为返回的行很少)
版本2与 timestamp <= ? AND timestamp < ?
EXPLAIN
SELECT * FROM test
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;
Run Code Online (Sandbox Code Playgroud)
说明:
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
Run Code Online (Sandbox Code Playgroud)
它对索引使用范围扫描,然后仅从表中读取相应的行.
Ham*_*sia 10
SELECT * FROM `table` WHERE timestamp >= CURDATE()
Run Code Online (Sandbox Code Playgroud)
它更短,没有必要使用'AND timestamp <CURDATE()+ INTERVAL 1 DAY'
因为CURDATE()总是返回当前日期
| 归档时间: |
|
| 查看次数: |
180531 次 |
| 最近记录: |