2015-09-09 209 views
0

我對MySQL DATE和DATE_FORMAT有些熟悉。INTERVAL 30天沒有給出預期的結果

但是,使用INTERVAL-30 DAY運行查詢日期範圍時,要麼沒有得到正確的輸出,要麼會拋出錯誤。仔細查看錶格,發現date_buy的每一行都是這種格式: 2015年9月9日星期一,等等。我嘗試使用PHP date('D d F Y')而不是DATE(NOW())等等,但我無法解決這個問題。有沒有另外一個已知的解決方法呢?

是的,已經嘗試了一下date_buy_x和date_buy_y。即使表中有記錄,它也不會返回任何內容。

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE date_buy >= $date - INTERVAL 30 DAY 
GROUP BY date_buy 

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE date_buy BETWEEN date_buy_x && date_buy_y 
GROUP BY date_buy ORDER BY date_buy DESC 

UPDATE

SO,基於所述建議,並進一步展望DATE_FORMAT和CURDATE參數,已經能夠顯示數據。 ORDER BY還必須在DATE_FORMAT(date_buy,'%a%d%M%Y')才能正確輸出。但是,關於INTERVAL 30 DAY參數仍然存在問題。

WHERE datebuy <= DATE_FORMAT(CURDATE() - INTERVAL 30 DAY,'%a %d %M %Y') 
GROUP BY date_buy ORDER BY DATE_FORMAT(date_buy, '%a %d %M %Y') DESC 

這是帶回的數據,但仍遠超出了範圍,這讓我覺得這是不接受的間隔要求。

Sat 22 November 2014 (50 sales) 
Thu 18 December 2014 (50 sales) 
Thu 22 January 2015 (20 sales) 
Sun 25 January 2015 (20 sales) 
Mon 06 April 2015 (25 sales) 
Sun 12 April 2015 (25 sales) 
Mon 03 August 2015 (10 sales) 

當輸出只能是:

Mon 03 August 2015 (10 sales) 
+1

不存儲日期爲字符串!恐怖。修復日期存儲,所有其他將修復其自我 –

+0

Dagon。該解決方案需要此特定日期格式用於跨頁面的其他顯示,這就是爲什麼以這種方式存儲的原因。將當前日期固定在行中會很痛苦。 – charless

+1

寫一些東西來讀取該字段的日期,解析它們,並將它們以正確的日期格式保存到您將從現在開始使用的新字段中。 – developerwjk

回答

0

無疑可以做:

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE DATE(STR_TO_DATE(date_buy, '%a %d %M %Y')) >= $date - INTERVAL 30 DAY 
GROUP BY date_buy 

除非$date也是在這個字符串格式,在這種情況下,你需要使用STR_TO_DATE函數也是如此。

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE DATE(STR_TO_DATE(date_buy, '%a %d %M %Y')) >= DATE(STR_TO_DATE($date, '%a %d %M %Y')) - INTERVAL 30 DAY 
GROUP BY date_buy 
+1

I完全忽略了%a。我確實嘗試了%W,結果是漫長的一天。 {{face-plams self}}。謝了哥們。我會放棄它。 – charless

+0

希望你沒有很多數據,因爲這是一個性能殺手 –

+0

我會使用STR_TO_DATE解析日期和更新一個新字段,然後切換字段或類似的東西,因爲不斷地進行轉換條款將會損害業績 – developerwjk

0

怎麼樣date_sub(),使用date_format以相同的格式,當查詢

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE DATE_FORMAT(DATE(date_buy,'%Y %m %d')) >= DATE_FORMAT(DATE_SUB(DATE($date,INTERVAL 30 DAY),'%Y %m %d')) 
GROUP BY date_buy 
相關問題