如何选择具有当前时间戳的行?

我试图只从数据库表中选择今天的记录。

目前我使用

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

但这需要过去24小时的结果,我需要它只选择今天的结果,忽略时间。如何只根据日期选择结果?

248909 次浏览

使用 DATECURDATE()

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

警告! 此查询无法有效地使用索引 。要获得更有效的解决方案,请参见下面的 < a href = “ https://stackoverflow. com/a/14769096/285587”> 答案

在 DEMO 上查看执行计划

简单地定下日期:

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

如果希望使用索引,而查询不执行表扫描:

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与 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)行,然后执行文件排序(这不是问题,因为返回的行很少)


第二版与 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

它使用 对索引进行范围扫描,然后只从表中读取相应的行。

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

它更短,不需要使用‘ AND 时间戳 < CURDATE () + INTERVAL 1 DAY’

因为 CURDATE ()总是返回当前日期

函数

我们有多少种方法可以剥这只猫的皮? 这里还有另一种变体。

table中选择 * ,日期(FROM _ UNIXTIME (timestamp)) = “2015-11-18”;

在我看来,这可能是最简单的:

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

如果你想与某个特定的日期进行比较,你可以直接这样写:

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

//这里的时间戳是具有时间戳类型的列的名称

对于获取今天的日期,CURDATE ()函数是可用的,因此:

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

在 Visual Studio 2017上,使用内置数据库进行开发,我在当前给定的解决方案中遇到了问题,我必须更改代码以使其工作,因为它抛出了 DATE ()不是内置函数的错误。

我的解决办法是:

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

或者您可以使用 CURRENT _ DATE 替代方法,结果是相同的:

SELECT * FROM yourtable WHERE created >= CURRENT_DATE

指南中的示例

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