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

解决方法:

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

过去七天完整,不包括今天

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

这种方法也有效. (我的偏好是将这些字符串文字显式地转换为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,julian日期,或偶尔非规范格式,或者从纪元开始以来的几秒钟,这个答案需要更长的时间.

标签:date-arithmetic,sql,mysql,where-clause

来源: https://codeday.me/bug/20190926/1818176.html

你可能感兴趣的:(MySQL七天以内)