256

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

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

8 回答 8

369
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

于 2012-05-26T01:50:51.630 回答
161

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

SELECT CURRENT_DATE - INTERVAL 30 DAY
于 2014-10-24T14:47:45.083 回答
27

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

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

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

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

BETWEEN如果你真的只想要从这一秒到这一秒前 30 天的东西,你可以使用,但根据我的经验,这不是一个常见的用例,所以我希望简化的查询能很好地为你服务。

于 2012-05-26T01:53:49.117 回答
27

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/en/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 
于 2014-10-08T13:04:03.123 回答
20

你也可以使用

select CURDATE()-INTERVAL 30 DAY
于 2016-12-23T06:19:49.857 回答
3
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

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

于 2016-05-31T06:31:46.680 回答
1

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

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

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

此外,subdate()的 2 元重载可能比使用interval. interval适用于需要非日组件的情况。

于 2015-04-03T20:48:37.077 回答
0

另一种方式

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
于 2014-11-18T15:36:34.850 回答