データベースに、月 (1-12) と年 (yyyy) の 2 つの列を持つテーブルがあります。
たとえば、2 つの日付の間のレコードを選択する必要があります。
select * from Calendar a where SOMEDATE between STARTDATE and ENDDATE.
問題は、この 2 つの列から STARTDATE と ENDDATE を作成するにはどうすればよいかということです。
...where SOMEDATE between
STR_TO_DATE(CONCAT_WS('-',STARTYEAR,STARTMONTH,1),'%Y-%m-%d')
and
DATE_SUB(
STR_TO_DATE(CONCAT_WS('-',ENDYEAR,ENDMONTH + 1,1),'%Y-%m-%d')
, INTERVAL DAY 1
)
関連する月に何日あるかわからないため、両方の部分を日付型に変換し、 からdate_sub
1 日を減算するために使用することに注意してください。ENDMONTH + 1
このソリューションを使用して、year
およびmonth
フィールドから日付を作成できます-
SELECT MAKEDATE(year, 1) + INTERVAL month - 1 MONTH FROM calendar;
これを WHERE 条件に適用します。
SELECT * FROM Calendar a
WHERE
MAKEDATE(year, 1) + INTERVAL month - 1 MONTH BETWEEN
@STARDATE - INTERVAL EXTRACT(DAY FROM @STARDATE) - 1 DAY
AND
@ENDDATE
しかし、STARTDATE と ENDDATE の基準についてお尋ねします。STARTDATE が '2012-09-20' の場合はどうすればよいですか? クエリは月 = 9 のレコードを返す必要がありますか?