关于日期的SQL查询

时间:2011-08-25 23:36:12

标签: php mysql sql database

我的架构中有以下关系:

Entries:
entryId(PK) auto_inc
date date

为了计算关系中的总条目,我在我的php中使用了一个查询:

$sql = mysql_query("SELECT COUNT(*) as Frequency FROM Entries WHERE date = '$date'");

我的问题是如何计算当前月份的参赛作品数量。

3 个答案:

答案 0 :(得分:1)

您需要基于日期列的查询之间的查询。

在哪个日期BETWEEN startdate AND enddate。

Between等于date> = startdate AND date< = enddate。当然也可以使用> = AND<显然会简化它,因为你不需要找到一个月的最后一天,而只需要使用DATE_ADD(...,INTERVAL 1 MONTH)来查找下个月的第一天。

然而,在这种情况下,startdate和enddate将从CURDATE()派生。

您可以使用CURDATE(),MONTH(),DATE_ADD和STR_TO_DATE来推导您需要的日期(当月的第一天,当月的最后一天)。本文解决了类似的问题,所有需要的技术都显​​示在您应该能够适应的示例中:

http://www.gizmola.com/blog/archives/107-Calculate-a-persons-age-in-a-MySQL-query.html

当月的第一天明显是一年(CURDATE()) - 01。您可以使用DATE_ADD将1个月添加到当月的第一天,然后DATE_ADD -1天计算的最后一天。

最新情况: 好的,我去制定了完整的查询。不要认为str_to_date确实需要获得索引效率,但实际上没有检查。

SELECT count(*) 
FROM entries
WHERE `date` BETWEEN 
CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE()), '-', '01')
AND
DATE_ADD(DATE_ADD(CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE()), '-', '01'), INTERVAL 1 MONTH), INTERVAL -1 DAY);

答案 1 :(得分:0)

试试这个

SELECT COUNT(1) AS `Frequency`
FROM `Entries`
WHERE EXTRACT(YEAR_MONTH FROM `date`) = EXTRACT(YEAR_MONTH FROM CURDATE())

请参阅EXTRACT()CURDATE()

修改:将NOW()更改为CURDATE(),因为此处更合适

答案 2 :(得分:0)

尝试

 $sql = mysql_query("SELECT COUNT(*) as Frequency FROM Entries WHERE MONTH(date) = MONTH(NOW()) );