< p > WHERE 子句位置不正确,必须跟随表引用和 JOIN 操作。 < /p >
< p > 像这样:< /p >
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子句中使用相同的表达式,将其与日期列进行比较,如下所示:
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
最近七天的完整日期,不包括今天
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
一旦我们有了返回符合我们特定用例的"start"和"end"值的表达式,也就是我们所说的"最近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
、儒略日或偶尔的非规范格式)存储为字符串,或者存储为自纪元开始以来的秒数。否则,本答案需要更长的说明。
DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
的行,我将不会得到任何输出(无错误,无结果)。 - karadayi