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_ADD
和DATE_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:对于这种情况,方法是相同的。开发返回指定日期/日期时间范围的 start 和 end 的表达式。我第一次解释“过去 7 天加上今天”是这些表达式返回的开始和结束,首先在 SELECT 语句中测试:SELECT DATE(NOW()) + INTERVAL - 7 DAY AS start_, DATE(NOW() + INTERVAL 1 DAY AS end_
。一旦我有了满足规范的表达式,我就会在 WHERE 子句中以t.dt >= start_expr AND t.dt < 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 天的主要内容,如果未能解决你的问题,请参考以下文章