MySQL选择过去7天

时间:2014-06-17 20:01:19

标签: 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);

如果我在今天和过去7天之间添加,我的代码将不会输出任何内容。

2 个答案:

答案 0 :(得分:64)

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)以及可用的数据......应该返回什么。

总结一下:一般的方法是确定一个" start"对于日期/日期时间范围,"结束"该范围的一部分,并在查询中引用它们。让我们考虑一些更容易的事情......"昨天"。

的所有行

如果我们的列是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

对于&#34;过去7天&#34;我们现在需要知道这是否意味着从现在开始,回到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 

一旦我们有表达式返回适用于&#34; start&#34;和&#34;结束&#34;对于我们的特定用例,我们的意思是&#34;过去7天&#34;,我们可以在WHERE子句中的范围比较中使用这些表达式。

(有些开发人员更喜欢使用DATE_ADDDATE_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

以上都假设我们正在存储&#34;日期&#34;在适当的DATE,DATETIME和/或TIMESTAMP数据类型中,并且不将它们存储为各种格式的字符串,例如'dd/mm/yyyy'm/d/yyyy,julian日期,或偶尔非规范格式,或自纪元开始以来的秒数,此答案需要更长时间。

答案 1 :(得分:5)

由于您使用的是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;
相关问题