我有一个表格,其中的条目有一个DATE字段。每个条目都有不同的日期。 我想选择上个月在数据库中注册的所有条目。怎么样?
我试过了:
SELECT *
FROM registries
WHERE reg_date = DATE_FORMAT(MAX(reg_date), "%m")`
......没有成功
答案 0 :(得分:3)
如果您想要过去30天,这将有效
SELECT * FROM `registries`
WHERE `reg_date` > DATE_SUB( NOW(), INTERVAL 30 DAY )
答案 1 :(得分:1)
基于OMG Ponies的更正查询:
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。 我相信除非你开始打击数百万条记录,否则它仍然可以正常运行。
另一方面,您可以通过首先查询MAX(reg_date)
来更快地运行它SELECT
CONCAT(DATE_FORMAT(MAX(r.reg_date), "%Y-%m"), '-01') AS first_day
FROM
registries AS r
然后在查询中注入结果:
SELECT
r.*
FROM
registries AS r
WHERE
r.reg_date BETWEEN '<first_day>' AND LAST_DAY('<first_day>')
使用first_day作为前一个查询结果的占位符。 如果你索引reg_date,这应该运行得非常快。
注意:LAST_DAY是仅限MySQL的功能。
答案 2 :(得分:0)
这将为您提供上个月(5月)的所有记录:
SELECT [col,] DATEDIFF(TIMESTAMP, 2010-05-01 00:00)dif1, DATEDIFF(TIMESTAMP,2010-05-31 00:00) dif2 FROM tablename HAVING dif1&gt; = 0 AND dif2&lt; = 0