我在这里阅读了一些帖子,似乎没什么特别的,但是我仍然不能选择过去几天的条目。
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天之间添加,则我的代码将不会输出任何内容。
最佳答案
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()返回的内容绑定(bind)在一起,因此我们可以跨周/月测试边界/年边界,依此类推。
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'
这种方法也行得通。 (我的偏好是使用CAST,CONVERT或+ INTERVAL技巧将这些字符串文字显式转换为DATETIME。
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
,朱利安日期,或者以偶发非规范的格式,或者以自纪元开始以来的秒数为单位,此答案将需要更长的时间。关于mysql - MySQL Select过去7天,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24272335/