mysql:使用PHP选择特定月份的所有条目

Wil*_*ill 7 php mysql

我有一个名为mysql的数据库表POST.
其中一个字段是时间戳,在创建记录时设置为默认为mysql服务器上的当前时间戳.

我需要一个SQL查询来提取在特定月份内具有时间戳的所有行.也就是说,三月的所有记录,或十一月的所有记录等.

Raf*_*ael 16

你必须使用monthname()

select * from thetable where monthname(date_field) = 'February'
Run Code Online (Sandbox Code Playgroud)

或月(),但此函数将返回一个数字

select * from thetable where month(date_field) = 2
Run Code Online (Sandbox Code Playgroud)

  • OMG是正确的.这不是有效的查询.它不会使用索引,如果你有数百万条记录,它将解析所有那些.使用类似这样的东西:select*from the table where date_field>'2011-03-01'and date_field <' 2011-04-01',您可以轻松找到两个月的开始日期.这将非常快. (5认同)
  • 我为自己的项目做了这个.我使用了月份(时间戳),过去需要花费5分钟才能完成1亿行.其中timestamp> ='month'和timestamp <'month'以秒为单位完成.您可以这样思考.当您使用月份(时间戳)时,服务器必须解析所有行以获取月份值. (2认同)
  • @ Raffael1984因为数据库中的所有[WHERE子句中的函数都是BLACKBOXES](http://use-the-index-luke.com/sql/where-clause/functions/case-insensitive-search).因此,我建议[将连续句点的查询写为显式范围条件.](http://use-the-index-luke.com/sql/where-clause/obfuscation/dates) (2认同)

OMG*_*ies 6

使用:

SELECT p.*
  FROM POST p
 WHERE p.date BETWEEN '2011-03-01' AND DATE_SUB('2011-04-01', INTERVAL 1 SECOND)
Run Code Online (Sandbox Code Playgroud)

如果存在索引POST.date,当使用列上的函数(IE:MONTHNAME,MONTH)时,将使用索引POST.date.

  • 假设OP想要任何一年的价值(IE:1970年以来的帖子真的适用吗?),除了索引使用的事实之外,这是不现实的. (2认同)