【问题标题】:SQL query to retrieve latest 2 week records检索最近 2 周记录的 SQL 查询
【发布时间】:2016-10-31 12:32:00
【问题描述】:

我有一个数据库,其中 CreatedDate 存储在 Unix 纪元时间和其他一些信息中。我想要一个能够根据最后一条记录检索最近 2 周记录的查询。 以下是部分示例

ID   User       Ranking     CreatedDate
-------------------------------------------------------
1   B.Sisko       1        1461136714  
2   B.Sisko       2        1461123378
3   B.Sisko       3        1461123378
4   B.Sisko       3        1461600137
5   K.Janeway     4        1461602181
6   K.Janeway     4        1461603096
7   J.Picard      4        1461603096

最后一条记录 CreatedDate 是 2016 年 4 月 25 日,所以我想要从 4 月 12 日到 4 月 25 日的记录。

我不确定如何比较以获取最新数据?任何建议

【问题讨论】:

标签: mysql sql


【解决方案1】:

最简单的方法可能是从今天的日期/时间中减去两周:

where CreatedDate >= UNIX_TIMESTAMP() - 7*24*60*60

另一种方法是将值转换为日期/时间:

where from_unixtime(CreatedDate) >= date_sub(now(), interval 2 week)

这种方法的优点是更容易与天对齐。所以,如果你想从午夜开始两周:

where from_unixtime(CreatedDate) >= date_sub(curdate(), interval 2 week)

缺点是列上的函数会阻止在该列上使用索引。

编辑:

这绝对不是你的问题的措辞。但在这种情况下,您应该使用:

select t.*
from t cross join
     (select from_unixtime(max(CreatedDate)) as maxcd from t) m
where from_unixtime(CreatedDate) >= date_sub(maxcd, interval 2 week);

【讨论】:

  • 感谢您的建议,但是我想获得的记录是基于上次条目的最新2周记录,而不是从今天开始。 @戈登林诺夫
【解决方案2】:

这可能看起来很奇怪,但您需要执行两个查询,其中一个是找到最大日期并取消 14 天,然后将其用作重新查询表的条件。我使用了 ID_NUM,因为 ID 是 Oracle 和其他 RDBMS 中的保留字。

    SELECT ID_NUM, USER, RANKING,
    TO_DATE('19700101000000', 'YYYYMMDDHH24MISS')+((CreatedDate-18000)
    /(60*60*24)) GOOD_DATE
    FROM MY_TABLE
    WHERE
    GOOD_DATE >=
    (SELECT MAX( TO_DATE('19700101000000', 'YYYYMMDDHH24MISS')+
    ((CreatedDate-18000) /(60*60*24))) -14
    FROM MY_TABLE)

【讨论】:

  • to_date() 不是 MySQL 函数。我不知道为什么这个答案会被接受。
  • Gordon:当然你是个天才,我错过了看到 mysql 标签,并希望为我工作的世界上的 OP 找到答案,即第一个 Oracle 和第二个 MS Access 当然她的问题的关键是使用子查询——所以也许这就是让她高兴的原因。日期处理可能不是最重要的部分
  • 。 . MySQL 具有用于这些转换的内置函数。接受这个答案没有意义。手动计算就可以了; OP决定接受不同数据库的答案真的很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多