MySQL如何在今天前7天和最后1小时的时间准确选择日期字段

时间:2015-11-06 16:06:37

标签: 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)

2 个答案:

答案 0 :(得分: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

修改: 出于某种原因,我在发布此问题后对您的问题进行了修改,并在您的问题中将iv_split_skill_metrics替换为<table_name>,但是以上例子无论如何都会有用当然,只需使用正确的表名和列名!

编辑2: 我现在看到您希望在7天加1小时前和7天前输入。我已经调整了我的答案,告诉你如何做到这一点。

答案 1 :(得分: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;