2017-04-03 17 views
0

where句で9月1日を使用する必要があり、年をハードコードしたくありません。間に9/1/yearを返す最善の方法は何ですか?mysql毎年同じ日

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

「2016-09-01」の置き換えを探して、次の年にやり直してください。また、同じ年のoct、nov、decで働く必要があります。

+1

あなたは 'between文章'を表示できますか?私たちにdbスキーマ、サンプルデータ、および期待される出力を示してください。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を改善し、より良い回答を得る方法を学ぶことができます。 –

+0

ここで、 '2016-09-01'とDATE_ADD(CURDATE()、INTERVAL 1 DAY)の間のp.post_date '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

それはそれです!ありがとう。最終ソリューション: ここで、p.post_dateは 月(CURDATE())<9 THEN STR_TO_DATE(CONCAT(YEAR(CURDATE()) - 1、 '-09'、 '-01')、 '%Y-とDATE_ADD(CURDATE()、%-m、%d) 、INTERVAL 1 DAY) – SJ14420

2

あなたはmonth()day()を使用することができます。

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

これをbetweenステートメントでどのように使用するのですか? ここで、 '2016-09-01'とDATE_ADD(CURDATE()、INTERVAL 1 DAY)の間のp.post_date – 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/09/01です。翌年9月1日に報告期間が始まります。 – SJ14420

関連する問題