kar*_*ayi 32 mysql sql where-clause date-arithmetic
我在这里阅读了一些帖子,似乎没什么特别的,但我还是不能选择最后几天的条目.
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);
Run Code Online (Sandbox Code Playgroud)
如果我在今天和过去7天之间添加,我的代码将不会输出任何内容.
spe*_*593 83
该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
Run Code Online (Sandbox Code Playgroud)
编辑(三年多以后)
上面基本上回答了这个问题"我试图在我的查询中添加WHERE子句,现在查询返回错误,我该如何解决?"
关于写一个检查"最近7天"日期范围的条件的问题......
这实际上取决于解释规范,表中列的数据类型是什么(DATE或DATETIME)以及可用的数据......应该返回什么.
总结一下:一般方法是识别日期/日期时间范围的"开始"和该范围的"结束",并引用查询中的那些.让我们考虑一些更容易的事情......"昨天"的所有行.
如果我们的列是DATE类型.在将表达式合并到查询中之前,我们可以在一个简单的SELECT中测试它
SELECT DATE(NOW()) + INTERVAL -1 DAY
Run Code Online (Sandbox Code Playgroud)
并验证返回的结果是我们所期望的.然后我们可以在WHERE子句中使用相同的表达式,将它与DATE列进行比较,如下所示:
WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
Run Code Online (Sandbox Code Playgroud)
对于DATETIME或TIMESTAMP列,我们可以使用>=
和<
不等式比较来指定范围
WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
Run Code Online (Sandbox Code Playgroud)
对于"过去7天",我们需要知道现在是否从现在开始,返回7天...例如最后7*24小时,包括比较中的时间成分,......
WHERE datetimecol >= NOW() + INTERVAL -7 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
Run Code Online (Sandbox Code Playgroud)
过去七天完整,不包括今天
WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
Run Code Online (Sandbox Code Playgroud)
或过去六天完整的日子加上今天到目前为止......
WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
Run Code Online (Sandbox Code Playgroud)
我建议在SELECT语句中测试右侧的表达式,我们可以使用用户定义的变量代替NOW()进行测试,而不是绑定到NOW()返回的内容,这样我们可以测试边界,跨周/月/年边界,等等.
SET @clock = '2017-11-17 11:47:47' ;
SELECT DATE(@clock)
, DATE(@clock) + INTERVAL -7 DAY
, @clock + INTERVAL -6 DAY
Run Code Online (Sandbox Code Playgroud)
一旦我们有表达式返回对我们的特定用例"开始"和"结束"有效的值,我们在"最近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'
Run Code Online (Sandbox Code Playgroud)
这种方法也有效.(我的偏好是将这些字符串文字明确地转换为DATETIME,使用CAST,CONVERT或只是+ INTERVAL技巧......
WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND
Run Code Online (Sandbox Code Playgroud)
上述所有假设我们现在存储在适当的日期,DATETIME和/或TIMESTAMP数据类型"日期",而不是将它们存储在不同的格式如琴弦'dd/mm/yyyy'
,m/d/yyyy
朱利安日期,或者偶尔不规范的格式,或者多项从纪元开始以来的几秒钟,这个答案需要更长的时间.
由于使用的是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;
Run Code Online (Sandbox Code Playgroud)