2011-02-01 65 views
7

我有一个名为updatetime的列,它是一个timestamp。因此,例如,平均值可能是:2011-02-01 09:00:51。我希望能够搜索并返回一天中特定时间的所有结果,而不管日期如何。mysql - 按小时搜索时间戳

例如,如果我搜索的价值BETWEEN 09:00:00 AND 09:59:99列它将返回:

2011-02-01 09:00:51 
2011-01-31 09:20:51 
2011-01-11 09:55:44 
etc.... 

SELECT * FROM table WHERE updatetime ......

的思考?

回答

14

您可以使用HOUR()功能:

SELECT * FROM 'table' WHERE HOUR(`updatetime`) = 9 

唉,这个查询的性能将是可怕,只要你去了几千行 - 功能都没有可转位,所以会有每次查询运行时进行全表扫描。

我们在类似的情况下做了什么:我们创建了另一列updatetime_hour,对它进行了索引,并在插入时对其进行了填充(并在更新时进行了更新);那么查询变快:

SELECT * FROM 'table' WHERE `updatetime_hour` = 9 

是的,我们非规范化的数据,这是一个有点看家,但我还没有看到一个更快的解决方案。 (我们认为和测量INSERT和UPDATE触发器来填充从updatetimeupdatetime_hour,但决定对性能,看看他们是否对您有用。)

+0

好点什么工作回合的表现。我可以很容易地实现插入索引小时列,但是有关如何通过先前的60k行以及使用'updatetime_hour'列数据更新的任何想法? – themerlinproject 2011-02-01 17:34:27

1

尝试HOUR()

SELECT * FROM table WHERE HOUR(updatetime) = 9; 

这将返回九点00分00秒和9点59分59秒之间的所有行。

HOUR()只返回日期的小时部分。

1
SELECT * FROM table WHERE hour('updatetime') = 9; 

将返回上午9点..

0

可能性: SELECT * FROM 'table' WHERE HOUR(updatetime)='09';

0

这些答案不工作,这是我唯一的

SELECT hour(FROM_UNIXTIME(`updatetime`)) AS date_formatted FROM `table` where hour(FROM_UNIXTIME(`updatetime`))='9'