2010-06-01 35 views
2

我有一个表中有一个日期字段的条目。每个条目都有不同的日期。 我想选择上个月登记在数据库中的所有条目。怎么样?如何选择上个月的所有条目?

我想:

SELECT * 
    FROM registries 
WHERE reg_date = DATE_FORMAT(MAX(reg_date), "%m")` 

...没有成功

+3

上一个日历月?过去30天? – 2010-06-01 23:20:59

回答

1
基于

在OMG小马与更正查询:

SELECT 
    r.* 
FROM 
    registries AS r 
JOIN (
    SELECT 
    MAX(t.reg_date) AS max_date 
    FROM 
    registries AS t) AS t 
ON DATE_FORMAT(t.max_date, '%Y-%m') = DATE_FORMAT(r.reg_date, '%Y-%m') 

虽然查询的性能不会是优秀的,因为它操作JOIN两个计算值。 我相信它仍然可以表现得体,除非你开始击打数百万条记录。

SELECT 
    r.* 
FROM 
    registries AS r 
WHERE 
    r.reg_date BETWEEN '<first_day>' AND LAST_DAY('<first_day>') 

随着FIRST_DAY为:

在另一方面,你也许可以更快地通过第一个查询的MAX(reg_date)

SELECT 
    CONCAT(DATE_FORMAT(MAX(r.reg_date), "%Y-%m"), '-01') AS first_day 
FROM 
    registries AS r 

然后注入在查询结果中运行它以前的查询结果的占位符。 只要你索引了reg_date,这应该运行得非常快。

注意:LAST_DAY是仅限MySQL的函数。

3

如果你想在过去的30天,这将工作

SELECT * FROM `registries` 
WHERE `reg_date` > DATE_SUB(NOW(), INTERVAL 30 DAY) 
+0

这。用这个。 – Entendu 2010-06-02 02:31:48

0

这会给你上个月的所有记录(May):

SELECT [col,] DATEDIFF(时间戳, 2010-05-01 00:00)DIF1, DATEDIFF(时间戳,2010-05-31 00:00) DIF2 FROM表名HAVING DIF1> = 0 AND DIF2 < = 0

相关问题