Answers:
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/zh-CN/date-and-time-functions.html#function_date-add
对于不想使用的人DATE_SUB
,请使用CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAY
。由于该问题提到“从当前日期时间减去30天”,因此OP可能不需要。
current_timestamp
代替current_date
让我们不要使用,NOW()
因为您丢失任何查询缓存或优化,因为每次查询都不同。请参见MySQL文档中不应使用的功能列表。
在下面的代码中,我们假设此表随着时间增长。添加了新内容,并且您只想显示最近30天内的内容。这是最常见的情况。
请注意,日期已作为字符串添加。最好以这种方式从调用代码中添加日期,而不是使用该NOW()
函数,因为它会杀死您的缓存。
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
BETWEEN
如果您真的只想从第二秒到第二天的30天之间使用东西,则可以使用,但是根据我的经验,这不是常见的用例,因此我希望简化查询可以很好地为您服务。
NOW()
并且仍然在答案中使用它。o_O PS:您的查询将返回另一个结果,而不是OP可能想要的结果
BETWEEN
和>=
不同的运营商,你知道吗?我的查询限制了30 days ago AND today
this 的结果集everything after 30 days ago
。因此,tomorrow
记录将不会与我的记录和您的原始查询匹配,但将与该答案匹配
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
您也可以使用
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
您可以在SQL中使用日期格式进行格式化。
如果只需要日期而不是时间,请使用:
select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();
由于curdate()
省略了时间部分,因此在您只对日期感兴趣的情况下,它的速度可能比now()
“语义上正确的” 更快,并且更“正确”。
此外,subdate()
2 arar重载可能比使用快interval
。
interval
旨在用于需要非日制组件的情况。
subdate(curdate(), 30)
比CURRENT_DATE - INTERVAL 30 DAY
?更快。你有证据吗?那将会有多快?几微秒?
subdate
您可能认为它的“更快”可能是由其“ 2-arity超载”以某种方式解释的,但是,如果这是一个愚蠢的问题,请原谅我,这些词是什么意思(关于功能)?特别是什么是“ 2-arity”?
curdate()
实际上可能是错误的选择,因为OP似乎想“从当前日期时间减去30天”(强调我的意思)。