2012-05-26 175 views

回答

15

让为你失去任何查询缓存或优化,因为查询每次都是不同的不使用NOW()。请参阅MySQL documentation中不应使用的功能列表。

在下面的代码中,我们假设这张表随着时间而增长。新的东西被添加,你想显示在过去30天的东西。这是最常见的情况。

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

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

您可以使用BETWEEN,如果你真的只是想的东西就在这个第二个30天在此之前很第二,但是这不是一个常见的情况在我的经验,所以我希望简化查询可以为你服务好。

+2

所以你建议不要使用'NOW()'并且仍然在你的答案中使用它。 o_O PS:您的查询将返回**另一个**结果,而不是OP可能想要的结果 – zerkms

+0

@zerkms此查询如何产生与查询不同的结果集? – user784637

+1

@ user784637:uhm,'BETWEEN'和'> ='是不同的操作符,你知道吗?我的查询限制了“30天前和今天”的结果集,这是“30天前后的所有内容”。所以'明天'记录不匹配我的和你原来的查询,但会匹配这个答案 – zerkms

4

的MySQL减去从现在天:

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

打印:

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

为了谁不希望使用DATE_SUB,使用CURRENT_DATE

SELECT CURRENT_DATE - INTERVAL 30 DAY 
+1

如果可以的话,我会给这个+10。 SQL应该都是关于可读性的,并且这是执行此操作最可读的方式。 –

+7

比使用NOW() - INTERVAL 30 DAY更具可读性但不同的结果。由于问题提到“从当前**日期时间减去30天**”,这可能不是OP想要的。 –

0

另一方式

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

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

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

由于curdate()省略时间部分,它比now()更快potentially并在那里你只能是案件多“语义正确”对日期感兴趣。

另外,subdate()的2值过载可能比使用interval更快。 interval适用于您需要非日间组件的情况。

+11

所以,你声称'subdate(curdate(),30)'比'CURRENT_DATE - INTERVAL 30 DAY'要糟吗?你有证据吗?那会有多快?几微秒? –

+0

@ypercube,哇,这个评论如何得到+5票,一天...你做了什么?另外,我在帖子中澄清说它“可能更快”。 – Pacerier

+2

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

1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y') 

您可以通过在SQL中使用日期格式进行格式化。

7

您还可以使用

select CURDATE()-INTERVAL 30 DAY 
相关问题