我正在尝试创建一个从数据库中获取一些数据并使用此数据生成一些统计数据的网站。
这个想法是允许用户选择一个月,然后只查询该月的数据。因此,如果用户选择1月,则查询数据> 01/01/2011和< 31/01/2011。
我考虑过从月份开始生成起始数据,然后再添加一个月并减去一天,这样我得到了给定月份的最后一天,但我不认为这是最好的方法,也不知道如何生成给定月份的完整日期。
有什么想法吗?
答案 0 :(得分:4)
以SQL为中心的方式:
SELECT * FROM `foo` WHERE MONTH(`date`) = 3 AND YEAR(`date`) = 2011
替换您选择的月份和年份数字。
以PHP为中心的方式:
$month = 3;
$year = 2011;
$firstDay = "$year-$month-1";
$lastDay = "$year-$month-" . date('t', strtotime($firstDay));
$query = "SELECT * FROM `foo`
WHERE `date` >= '$firstDay'
AND `date` <= '$lastDay'";
答案 1 :(得分:1)
选择上个月的记录:
select `id`
from `orders`
where `created_at` > LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
AND `created_at` < DATE_ADD(LAST_DAY(CURDATE()), INTERVAL 1 DAY)
和前一个月:
select `id`
from `orders`
where `created_at` > LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH))
AND `created_at` < DATE_ADD(LAST_DAY(CURDATE() - INTERVAL 1 MONTH), INTERVAL 1 DAY)
等
答案 2 :(得分:1)
这是给你的一课。
大多数新手程序员都在寻找“最好”,“最有效”的方法和东西 虽然他们根据代码的数量判断效率! “更少的代码 - 更高效!” - 他们认为。当然是错的。让我们将您的“高效”解决方案与“低效”解决方案进行比较:
mysql> explain select * from Board where year(date) = 2011 and month(date) = 1;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | Board | ALL | NULL | NULL | NULL | NULL | 18113 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
mysql> explain select * from Board where date > '2010-12-31' and date < '2011-02-01';
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | Board | range | date | date | 9 | NULL | 325 | Using where |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
注意possible keys
和rows
参数。
在后一种情况下,数据库将获得您需要的精确行,在前者中 - 它将选择表中的每一行,在日期应用函数并将其与常量进行比较。
同样适用于那些在你无知的评论之后删除了他的好答案的可怜人的解决方案:
mysql> explain select * from Board where `date` > LAST_DAY(DATE_SUB('2011-01-15', INTERVAL 1 MONTH)) AND `date` < DATE_ADD(LAST_DAY('2011-01-15'), INTERVAL 1 DAY);
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | Board | range | date | date | 9 | NULL | 325 | Using where |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
努夫说。
答案 3 :(得分:0)
如果要将数据保存为DateTimeStamp,只需将条件添加到查询中,该条件仅返回特定年份特定月份的结果。你可以使用LIKE子句。