0

次のフィールドを持つテーブルがあります。

themeID = int(11)  
partnerID = int(11)  
name = varchar(255)  
BeginDate = date (Y-m-d)  
EndDate = date (Y-m-d)  
active = tinyint(1) 

01-30BeginDate が の前、EndDateが の後にあるテーマを選択したいと考えています01-30年ではなく、月と日で検索したいだけです。

次のクエリを使用しますが、何も返されません (0 行):

SELECT
  DATE_FORMAT(BeginDate, '%m-%d'),
  DATE_FORMAT(EndDate, '%m-%d')
FROM theme
WHERE DATE_FORMAT(BeginDate, '%m-%d') <= '01-30'
    AND DATE_FORMAT(EndDate, '%m-%d') > '01-30'
ORDER BY BeginDate

私は何を間違えましたか?

PS。今より前に始まり(01-30)、今より後に終わるレコード(01-30)があります。

テーブルデータ の編集

Default ...... 2000-01-01 ... 2000-01-01  
Oud en Nieuw . 2000-12-26 ... 2000-01-04  
Pasen ........ 2000-03-28 ... 2000-04-04  
Dierendag..... 2000-10-04 ... 2000-10-04  
Sinterklaas .. 2000-11-20 ... 2000-12-05  
Kerstmis ..... 2000-12-23 ... 2000-12-26  
Winter ....... 2000-12-21 ... 2000-03-20  
4

2 に答える 2

1

これはおそらく最適化できますが、これはすべての日付を同じ年 (2000 年) に変換し、それに応じて比較します。

SELECT * 
FROM (
   SELECT themeID, name,
      DATE_FORMAT(BeginDate, '%m-%d'), 
      DATE_FORMAT(EndDate, '%m-%d'),
      DATE(BeginDate + INTERVAL (2000 - Extract(YEAR from BeginDate)) YEAR) NewBeginDate,
      DATE(EndDate + INTERVAL (2000 - Extract(YEAR from EndDate)) YEAR) NewEndDate
FROM theme
) a
WHERE NewBeginDate <= DATE(Now() + INTERVAL (2000 - Extract(YEAR from Now())) YEAR)
  AND NewEndDate > DATE(Now() + INTERVAL (2000 - Extract(YEAR from Now())) YEAR)

そして、これがSQL Fiddleです。

そうは言っても、あなたのクエリは私にとってはうまくいくようです。上記の Fiddle で独自のクエリを試してください。

幸運を。

于 2013-01-30T16:20:49.387 に答える
1

このようなもの?

... WHERE (MONTH(BeginDate) <= 1 AND DAY(BeginDate) < 30)
        AND (MONTH(EndDate) >= 1 AND DAY(EndDate) > 30)

デモを見る

于 2013-01-30T15:54:40.083 に答える