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、朱利安日期,或零星的非规范格式,或自纪元开始以来的秒数,这个答案需要更长的时间。