2010-06-01 38 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

相關問題