2015-11-06 21 views
0

我有一个查询,选择从当前时间过去1小时创建的记录。MySQL如何正确选择日期字段在今天之前和过去1小时的时间

select ts from <table_name> where ts >= DATE_SUB(NOW(), interval 1 hour); 

我可以7天前也选择日期使用

select count(*) from <table_name> where ts >= DATE_SUB(NOW(), interval 7 day);

如何使用这两个日期功能获取从当前时间起的7天之前和从当前时间过去1小时之前的记录。

例如,如果现在时间是2015-11-06 10:03:00那么我怎样才能获取2015-10-30 09:03:00到2015-10-30 10:03之间的时间数据:00

我想这样的事情,但它给语法错误:

select ts from <table_name> where ts >= DATE_SUB(DATE(NOW()), INTERVAL 7 DAY), interval 1 hour) 
select ts from <table_name> where ts >= DATE_SUB(NOW(), INTERVAL 7 DAY), interval 1 hour) 

回答

4

你的例子有语法错误(太多闭括号))。如果您想使用DATE_SUB(),则需要使用两次。为了得到一个时间和彼此之间的条目,使用WHERE ... BETWEEN ... AND ...

您可以使用此:

SELECT ts 
FROM iv_split_skill_metrics 
WHERE ts BETWEEN 
    DATE_SUB(
     DATE_SUB(DATE(NOW()), INTERVAL 7 DAY), 
     interval 1 hour) 
    AND 
    DATE_SUB(DATE(NOW()), INTERVAL 7 DAY) 

,或者甚至更好,跳过DATE_SUB()完全,只是做减法,这样的:

SELECT ts 
FROM iv_split_skill_metrics 
WHERE ts BETWEEN NOW() - INTERVAL 7 DAY - INTERVAL 1 HOUR 
    AND NOW() - INTERVAL 7 DAY 

编辑:由于某种原因,我在发布此文章后编辑了您的问题,并用替换了在你的问题,但上面的例子将工作不管。当然,只需使用正确的表格和列名即可!

编辑2:我现在要7天加1小时前至7天的条目前看到的。我调整了我的答案,告诉你如何做到这一点。

1

你的目标不是100%清楚,但只是我的尝试:

SELECT ts 
FROM table_name 
WHERE ts >= DATE_ADD(DATE_ADD(NOW(), INTERVAL -7 DAY), INTERVAL -1 HOUR) 
    AND ts <= DATE_ADD(NOW(), INTERVAL -7 DAY); 

但形式表现角度来看,这查询将要快得多:

http://sqlfiddle.com/#!9/9edd1/2

SET @end = DATE_ADD(NOW(), INTERVAL -7 DAY); 
SET @start = DATE_ADD(@end, INTERVAL -1 HOUR); 

SELECT ts 
    FROM table_name 
    WHERE ts BETWEEN @start AND @end; 
相关问题