MySQL 选择过去 7 天

Posted

技术标签:

【中文标题】MySQL 选择过去 7 天【英文标题】:MySQL Select last 7 days 【发布时间】:2014-08-07 23:15:16 【问题描述】:

我在这里阅读了一些帖子,似乎没什么特别的,但我仍然无法选择最后几天的条目。

SELECT 
    p1.kArtikel, 
    p1.cName, 
    p1.cKurzBeschreibung, 
    p1.dLetzteAktualisierung, 
    p1.dErstellt, 
    p1.cSeo,
    p2.kartikelpict,
    p2.nNr,
    p2.cPfad

FROM 
    tartikel AS p1 WHERE DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)

INNER JOIN 
    tartikelpict AS p2 
    ON (p1.kArtikel = p2.kArtikel) WHERE (p2.nNr = 1)

ORDER BY 
    p1.kArtikel DESC

LIMIT
    100;', $connection);

如果我添加今天和过去 7 天之间的时间,我的代码将不会输出任何内容。

【问题讨论】:

那是我在代码中阅读和使用的帖子。 你没有解释你得到了什么错误或它是如何不起作用的。除非这个问题得到改进,否则它将关闭一个重复的问题。 我没有得到任何输出(没有错误,没有结果)如果我添加带有DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)的行 那些列名害死我 【参考方案1】:

WHERE 子句放错了位置,它必须遵循表引用和 JOIN 操作。

类似这样的:

 FROM tartikel p1 
 JOIN tartikelpict p2 
   ON p1.kArtikel = p2.kArtikel 
  AND p2.nNr = 1
WHERE p1.dErstellt >= DATE(NOW()) - INTERVAL 7 DAY
ORDER BY p1.kArtikel DESC

编辑(三年多后)

以上内容基本上回答了“我试图在查询中添加 WHERE 子句,现在查询返回错误,我该如何解决?”的问题

关于编写一个检查“过去 7 天”日期范围的条件的问题......

这实际上取决于解释规范、表中列的数据类型是什么(DATE 或 DATETIME)以及可用的数据......应该返回什么。

总结一下:一般方法是确定日期/日期时间范围的“开始”和该范围的“结束”,并在查询中引用它们。让我们考虑一些更简单的事情......“昨天”的所有行。

如果我们的列是 DATE 类型。在将表达式合并到查询中之前,我们可以在简单的 SELECT 中对其进行测试

 SELECT DATE(NOW()) + INTERVAL -1 DAY 

并验证返回的结果是否符合我们的预期。然后我们可以在 WHERE 子句中使用相同的表达式,将其与 DATE 列进行比较,如下所示:

 WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY

对于 DATETIME 或 TIMESTAMP 列,我们可以使用 >=< 不等式比较来指定范围

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY

对于“过去 7 天”,我们需要知道这是否意味着从现在开始,返回 7 天......例如最近 7*24 小时,包括比较中的时间分量,...

 WHERE datetimecol >= NOW() + INTERVAL -7 DAY
   AND datetimecol <  NOW() + INTERVAL  0 DAY

过去 7 天,不包括今天

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY

或过去六天加上今天到目前为止...

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
   AND datetimecol <  NOW()       + INTERVAL  0 DAY

我建议在 SELECT 语句中测试右侧的表达式,我们可以使用用户定义的变量代替 NOW() 进行测试,而不是与 NOW() 返回的内容绑定,这样我们就可以测试边界,跨越周/月/年界限,等等。

SET @clock = '2017-11-17 11:47:47' ;

SELECT DATE(@clock)
     , DATE(@clock) + INTERVAL -7 DAY 
     , @clock + INTERVAL -6 DAY 

一旦我们的表达式返回值适用于我们的特定用例的“开始”和“结束”,我们所说的“过去 7 天”,我们就可以在 WHERE 子句的范围比较中使用这些表达式。

(一些开发人员更喜欢使用DATE_ADDDATE_SUB 函数来代替+ INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR 语法。

mysql 提供了一些方便的函数来处理 DATE、DATETIME 和 TIMESTAMP 数据类型... DATE、LAST_DAY、

有些开发者喜欢在其他代码中计算开始和结束,并在SQL查询中提供字符串字面量,这样提交给数据库的查询就是

  WHERE datetimecol >= '2017-11-10 00:00'
    AND datetimecol <  '2017-11-17 00:00'

而且这种方法也有效。 (我的偏好是将这些字符串文字显式转换为 DATETIME,无论是使用 CAST、CONVERT 还是仅使用 + INTERVAL 技巧......

  WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
    AND datetimecol <  '2017-11-17 00:00' + INTERVAL 0 SECOND

以上所有假设我们将“日期”存储在适当的 DATE、DATETIME 和/或 TIMESTAMP 数据类型中,而不是将它们存储为各种格式的字符串,例如'dd/mm/yyyy'm/d/yyyy、朱利安日期,或零星的非规范格式,或自纪元开始以来的秒数,这个答案需要更长的时间。

【讨论】:

我从来不知道 INTERVAL 命令。添加到工具箱的非常酷的工具。谢谢! @JunedAnsari:扩展答案,包括对“过去 7 天”的可能解释的讨论,以及对各种日期/日期时间范围的书面条件的一般性讨论。 “过去 7 个完整天,包括今天”的案例呢?? @AjayMistry:对于这种情况,方法是相同的。开发返回指定日期/日期时间范围的 startend 的表达式。我第一次解释“过去 7 天加上今天”是这些表达式返回的开始和结束,首先在 SELECT 语句中测试:SELECT DATE(NOW()) + INTERVAL - 7 DAY AS start_, DATE(NOW() + INTERVAL 1 DAY AS end_。一旦我有了满足规范的表达式,我就会在 WHERE 子句中以t.dt &gt;= start_expr AND t.dt &lt; end_expr 的形式使用这些表达式。 您可以简单地使用CURDATE() 而不是DATE(NOW())【参考方案2】:

由于您使用的是 INNER JOIN,因此您只需将条件放在 WHERE 子句中,如下所示:

SELECT 
    p1.kArtikel, 
    p1.cName, 
    p1.cKurzBeschreibung, 
    p1.dLetzteAktualisierung, 
    p1.dErstellt, 
    p1.cSeo,
    p2.kartikelpict,
    p2.nNr,
    p2.cPfad  
FROM 
    tartikel AS p1 INNER JOIN tartikelpict AS p2 
    ON p1.kArtikel = p2.kArtikel
WHERE
  DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
  AND p2.nNr = 1
ORDER BY 
  p1.kArtikel DESC
LIMIT
    100;

【讨论】:

以上是关于MySQL 选择过去 7 天的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 选择过去 7 天(周)的数据,如果不存在,则为空/零

MySQL 从 7 天前选择行

从Unix时间戳mysql中选择最近7天

如何根据 3 个不同的列在 mysql 中选择行

获取过去 7 天以来的行数

Beta 冲刺 (7/7)