DATE_FORMAT()sql返回0行

时间:2013-01-30 15:51:26

标签: mysql date select

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

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

我想在01-30之前选择具有BeginDate的主题,在01-30之后选择EndDate。 我只想搜索当月和这一年。

我使用以下查询,但我什么都没有回来(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  

2 个答案:

答案 0 :(得分:1)

这样的东西?

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

See the demo

答案 1 :(得分: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

话虽如此,你的查询似乎对我来说很好。在上面的小提琴中尝试自己的查询。

祝你好运。