MySQL查询具有定义日期间隔的行

时间:2018-01-05 09:20:16

标签: php mysql

我不知道如何解决以下问题:我的数据库中有几行,每行有一个时间戳。现在我想过滤条目的所有行,直到任意两个日期的日期间隔大于30天。 我没有特定日期的明确日期间隔,例如在2017年1月12日至2017年1月11日期间,这对我来说很容易。我所知道的是,从一行到下一行的时间戳间隔(查询必须按时间戳desc排序)不得超过30天。

请在http://sqlfiddle.com/#!9/55a521/2查看我的数据库 在这种情况下,显示的最后一个条目应该是id 65404844 的条目。如果你能给我一点暗示,我将不胜感激。

非常感谢!

2 个答案:

答案 0 :(得分:1)

您可以使用此查询构建过滤器。

SELECT
t.id,
from_unixtime(timestamp)
, IF(@pt < timestamp - 30*24*60*60, 1, 0) AS filter
, @pt := timestamp
FROM
t
, (SELECT @pt := MIN(timestamp) FROM t) v
ORDER BY timestamp

这里重要的是按时间戳排序。然后使用最低值初始化@pt变量。另一个重要的事情是以正确的顺序使用select子句。

首先,将当前记录与IF()函数中的变量进行比较。然后将当前记录分配给变量。这样,当评估下一行时,变量仍保留IF()函数中前一行的值。

要获取所需的行,请在子查询中使用上述查询进行过滤。

SELECT id, ts FROM (
    SELECT
    t.id,
    from_unixtime(timestamp) as ts
    , IF(@pt < timestamp - 30*24*60*60, 1, 0) AS filter
    , @pt := timestamp
    FROM
    t
    , (SELECT @pt := MIN(timestamp) FROM t) v
    ORDER BY timestamp
) sq 
WHERE sq.filter = 1

答案 1 :(得分:-1)

这会筛选出与前一行差异超过30天的行。 (第一个解决方案) - 仅在id列具有连续值

时有效
SELECT t.id, t.timestamp, DATEDIFF(FROM_UNIXTIME(t1.timestamp), FROM_UNIXTIME(t.timestamp)) AS days_diff
FROM tbl t
LEFT JOIN tbl t1 
    ON t.id = t1.id + 1
HAVING days_diff <= 30    
ORDER BY t.timestamp DESC;

这会过滤每个其他条目30天内的所有结果。

SELECT *
FROM tbl t
WHERE  EXISTS (
   SELECT id
   FROM tbl t1
   WHERE DATEDIFF(FROM_UNIXTIME(t1.timestamp), FROM_UNIXTIME(t.timestamp)) < 30
   AND   t1.id <> t.id
   )
ORDER BY t.timestamp desc;