2017-04-03 116 views
0

我需要在where子句中使用9月1日,並且不希望對年份進行硬編碼。什麼是返回9/1 /年以在兩者之間使用的最佳方式?mysql每年的同一天

where p.post_date between '2016-09-01' and DATE_ADD(CURDATE(),INTERVAL 1 DAY) 

尋找「2016-09-01」的替代品,以便它在明年和未來再次發揮作用。此外,需要爲同年的十月,十月和十月工作。

+1

你能告訴我們'語句之間'嗎?向我們展示數據庫模式,樣本數據和預期輸出。 \t請閱讀[**如何提問**](http://stackoverflow.com/help/how-to-ask) \t \t這裏是一個偉大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)來了解如何提高您的問題質量並獲得更好的答案。 –

+0

其中p.post_date位於'2016-09-01'和DATE_ADD(CURDATE(),INTERVAL 1天)之間 正在尋找「2016-09-01」的替代品,以便明年和未來再次運行。 – SJ14420

回答

0

基本上,你想上年當你當你轉動日後在本年度的轉折日期和當前一個之前。

我建議告訴MySQL你正在使用什麼日期格式,這樣做,你可以使用STR_TO_DATE函數。

CASE 
    WHEN MONTH(CURDATE()) < 9 THEN STR_TO_DATE(CONCAT(YEAR(CURDATE())-1, '-09-01'), '%Y-%m-%d') 
    ELSE STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-09-01', '%Y-%m-%d')) 
END 

你可以把它放在函數/例程中,並在需要的地方使用它。

+0

就是這樣!謝謝。最終溶液:CASE 其中p.post_date之間 WHEN MONTH(CURDATE())<9 THEN STR_TO_DATE(CONCAT(YEAR(CURDATE()) - 1, ' - 09', ' - 01'),「%Y- %0%(%d%) ELSE STR_TO_DATE(CONCAT(YEAR(CURDATE()),' - 09',' - 01'),'%Y-%m-%d')END 和DATE_ADD(CURDATE() ,INTERVAL 1天) – SJ14420

2

您可以使用month()day()

select t.* 
from t 
where month(datecol) = 9 and day(datecol) = 1; 
+0

如何在中間語句中使用它? 其中p.post_date介於'2016-09-01'和DATE_ADD(CURDATE(),INTERVAL 1天) – SJ14420

+0

在列上使用任何類型的函數都會阻止MySQL使用索引。不是一個好主意。 – Pred

+0

@Pred。 。 。我沒有看到如何在沒有'datecol'函數的情況下回答這個問題。我沒有看到你的答案與實際問題有關,但是OP的確如此,而這一點更重要。 –

1

我想你想獲得本年度的year/09/01

SELECT * 
FROM YourTable 
WHERE datecol = CONCAT (YEAR(CURDATE()) , '/09/01') 
+0

幾乎...有時它會是年減1。 像現在一樣,報告期爲2016年9月1日至今天。報告期將於明年9月1日重新開始。 – SJ14420