MySQL选择最近7天

71

我在这里读了一些帖子,看起来没什么特别的,但我仍然无法选择最近几天的条目。

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天之间的时间范围,我的代码将不会输出任何内容。


这是我阅读并在我的代码中使用的帖子。 - karadayi
1
你没有解释你遇到了什么错误,或者这个代码为什么不能正常工作。除非你改进这个问题,否则它将被关闭为重复问题。 - John Conde
如果我添加了带有 DATE(dErstellt) > (NOW() - INTERVAL 7 DAY) 的行,我将不会得到任何输出(无错误,无结果)。 - karadayi
那些列名把我搞崩了。 - Norielle Cruz
2个回答

161
< 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_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

以上所有假设都是在我们使用适当的DATE、DATETIME和/或TIMESTAMP数据类型存储“日期”,并且不将它们以各种格式(例如'dd/mm/yyyy'm/d/yyyy、儒略日或偶尔的非规范格式)存储为字符串,或者存储为自纪元开始以来的秒数。否则,本答案需要更长的说明。


1
我以前从未听说过 INTERVAL 命令。这是一个很酷的工具,可以添加到工具箱中。谢谢! - CTala
@JunedAnsari:扩展了回答,包括对“最近7天”的可能解释的讨论,以及在编写各种日期/时间范围条件时应采取的方法的一般讨论。 - spencer7593
1
"包括今天在内的最近七天完整日期是怎么样处理的??" - Ajay Mistry
@AjayMistry:对于这种情况,方法是相同的。开发表达式,返回指定日期/时间范围的开始结束。我首先尝试解释“过去七天加今天”,使用这些表达式返回的开始和结束,在SELECT语句中进行了第一次测试:SELECT DATE(NOW()) + INTERVAL - 7 DAY AS start_, DATE(NOW() + INTERVAL 1 DAY AS end_。一旦我有满足规范的表达式,我会在WHERE子句中使用这些表达式,形式为t.dt >= start_expr AND t.dt < end_expr - spencer7593
你可以直接使用 CURDATE() 代替 DATE(NOW()) - Dan
@Dan:CURRENT_DATE()CURRENT_DATECURDATE()的同义词,因此它们也是可选项。对我来说,更简单的方法是使用NOW()返回DATETIME。如果我们需要去掉时间组件,我们遵循与任何DATETIME相同的模式,使用DATE()函数返回DATE数据类型。(我认为最好避免使用CURDATE()及其同义词。) - spencer7593

7

由于您正在使用 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接