我试图从数据库表中仅选择今天的记录。
目前我使用
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
但这会导致过去24小时的结果,我需要它只选择今天的结果,忽略时间。如何仅根据日期选择结果?
答案 0 :(得分:162)
使用DATE
和CURDATE()
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
我猜使用DATE
仍使用INDEX 。
答案 1 :(得分:49)
如果要使用索引并且查询不进行表扫描:
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') ;
让我们现在尝试2个版本。
版本1 DATE(timestamp) = ?
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, timestamp <= ? AND timestamp < ?
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
它在索引上使用范围扫描,然后只从表中读取相应的行。
答案 2 :(得分:8)
SELECT * FROM `table` WHERE timestamp >= CURDATE()
它更短,不需要使用'AND timestamp&lt; CURDATE()+ INTERVAL 1 DAY'
因为CURDATE()总是返回当天
答案 3 :(得分:4)
或者您可以使用CURRENT_DATE替代方法,结果相同:
SELECT * FROM yourtable WHERE created >= CURRENT_DATE
答案 4 :(得分:2)
我们可以为这只猫涂多少种方法?这是另一种变体。
SELECT * FROM table
WHERE DATE(FROM_UNIXTIME(timestamp
))=&#39; 2015-11-18&#39;;
答案 5 :(得分:1)
简单地把它投到日期:
SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
答案 6 :(得分:0)
在我看来,这可能是最简单的:
SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');
答案 7 :(得分:0)
如果要与特定日期比较,可以直接将其写为:
select * from `table_name` where timestamp >= '2018-07-07';
//这里的时间戳是类型为时间戳的列的名称
或
要获取今天的日期,可以使用CURDATE()函数,因此:
select * from `table_name` where timestamp >= CURDATE();
答案 8 :(得分:0)
在Visual Studio 2017上,使用内置数据库进行开发时,我在使用当前给定的解决方案时遇到了问题,我不得不更改代码以使其起作用,因为它引发了DATE()不是内置函数的错误
这是我的解决方法:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)