0

我有一个包含以下字段的表:

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

我想选择 BeginDate before01-30和 EndDate after的主题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

像这样的东西?

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

查看演示

于 2013-01-30T15:54:40.083 回答
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 回答