如何从mysql中的当前日期时间减去30天?


194

如何从mysql中的当前日期时间减去30天?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();

Answers:



127

对于不想使用的人DATE_SUB,请使用CURRENT_DATE

SELECT CURRENT_DATE - INTERVAL 30 DAY

2
如果可以的话,我会给这个+10。SQL应该全部与可读性有关,这是最易读的方式。
Colin't Hart

9
比使用更具可读性,但结果不同NOW() - INTERVAL 30 DAY。由于该问题提到“从当前日期时间减去30天”,因此OP可能不需要。
ypercubeᵀᴹ

2
@ypercubeᵀᴹ然后使用current_timestamp代替current_date
isapir

21

让我们不要使用,NOW()因为您丢失任何查询缓存或优化,因为每次查询都不同。请参见MySQL文档中不应使用的功能列表。

在下面的代码中,我们假设此表随着时间增长。添加了新内容,并且您只想显示最近30天内的内容。这是最常见的情况。

请注意,日期已作为字符串添加。最好以这种方式从调用代码中添加日期,而不是使用该NOW()函数,因为它会杀死您的缓存。

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

BETWEEN如果您真的只想从第二秒到第二天的30天之间使用东西,则可以使用,但是根据我的经验,这不是常见的用例,因此我希望简化查询可以很好地为您服务。


3
因此,您建议不要没有用,NOW()并且仍然在答案中使用它。o_O PS:您的查询将返回另一个结果,而不是OP可能想要的结果
zerkms's

@zerkms该查询将如何产生与您的查询不同的结果集?
user784637

2
@ user784637:嗯,BETWEEN>=不同的运营商,你知道吗?我的查询限制了30 days ago AND todaythis 的结果集everything after 30 days ago。因此,tomorrow记录将不会与我的记录和您的原始查询匹配,但将与该答案匹配
zerkms 2012年

好吧,我的坏。通常,此类查询位于随时间增长的实时表中。这就是为什么我放弃两者之间的原因。我已经在上面澄清了我的答案。
约瑟夫·拉斯特

@JosephLust,要解决性能问题,请改用我的解决方案
Pacerier 2015年

17

MySQL从现在开始减去天数:

select now(), now() - interval 1 day

印刷品:

2014-10-08 09:00:56     2014-10-07 09:00:56

其他间隔时间表达单元参数:

https://dev.mysql.com/doc/refman/5.5/zh-CN/expressions.html#temporal-intervals

select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 



0

其他方式

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;

0

如果只需要日期而不是时间,请使用:

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

由于curdate()省略了时间部分,因此在您只对日期感兴趣的情况下,它的速度可能now()“语义上正确的” 更快,并且更“正确”。

此外,subdate()2 arar重载可能比使用快intervalinterval旨在用于需要非日制组件的情况。


11
因此,您声称这subdate(curdate(), 30)CURRENT_DATE - INTERVAL 30 DAY?更快。你有证据吗?那将会有多快?几微秒?
ypercubeᵀᴹ

2
我不知道。我当然不能支持我自己的评论。关于“可能的”更快的主张,我仍然看不到任何决定性的或间接的证据。即使速度更快,该条件也会被评估一次。除非您每分钟运行查询一百万次,否则差异将无关紧要。
ypercubeᵀᴹ

2
我想subdate您可能认为它的“更快”可能是由其“ 2-arity超载”以某种方式解释的,但是,如果这是一个愚蠢的问题,请原谅我,这些词是什么意思(关于功能)?特别是什么是“ 2-arity”?
Andriy M 2015年

1
而且,就问题的措词而言,curdate()实际上可能是错误的选择,因为OP似乎想“从当前日期时间减去30天”(强调我的意思)。
Andriy M

1
@AndriyM,好吧,因为该线程获得了5万次观看,所以我将答案留给只对时间部分感兴趣的人。关于“团结”,它指的是论点的数量。是的,这是正确的,在所有条件相同的情况下,2-arity函数可能比3-arity函数更快。在将新信息添加到印版之前,情况将一直如此。
Pacerier,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.