2014-06-17 182 views
10

我在这里阅读了一些帖子,似乎没有什么特别的,但我仍然无法选择最后几天的条目。MySQL选择最近7天

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

+0

那就是我读过的文章,并在我的代码中使用 – karadayi

+0

你不想要'不要解释你得到了什么错误,或者说这不起作用。除非这个问题得到改善,否则将会关闭一个重复的问题。 –

+0

我没有得到任何输出(没有错误,没有结果)如果我用'DATE(dErstellt)>(NOW() - INTERVAL 7 DAY)' – karadayi

回答

37

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()返回,所以我们可以测试边界,跨越周/月/年边界等等。

SET @clock = '2017-11-17 11:47:47' ; 

SELECT DATE(@clock) 
    , DATE(@clock) + INTERVAL -7 DAY 
    , @clock + INTERVAL -6 DAY 

一旦我们有返回的工作价值观的表达“开始”和“结束”为我们的具体使用情况,就是我们所说的“过去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,转换或只是+间隔招...

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,朱利安日期)或以零星非规范格式存储为字符串,或者作为从该纪元开始以来的秒数,这个答案需要更长的时间

+0

'添加行,我从来不知道INTERVAL命令。非常酷的工具添加到工具箱。谢谢 ! – CTala

+0

@JunedAnsari:'dtcol> = DATE(NOW())+ INTERVAL -7天和dtcol spencer7593

+0

@JunedAnsari:扩展答案包括讨论“过去7天”的可能解释,以及对各种日期/日期时间范围写入条件的方法进行一般性讨论 – spencer7593

4

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