【问题标题】:DATE_FORMAT() sql return 0 rowsDATE_FORMAT() sql 返回 0 行
【发布时间】:2013-01-30 15:51:26
【问题描述】:

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

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

我想选择 BeginDate 在01-30 之前,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  

【问题讨论】:

  • 您在这些日期之前和之后有记录吗?
  • 我已经测试了查询,没有问题。您可能在数据库表中没有记录
  • 您的示例数据中没有从现在开始到现在结束的记录...也许您还需要检查从前一年开始到今年晚些时候结束的记录?
  • @fthiella 当我使用 3 月和 29 日时,我应该返回“Pasen”,对吗?
  • @GertKommer 是的...但它已经有效...sqlfiddle.com/#!2/a36b2/13

标签: mysql date select


【解决方案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 中尝试您自己的查询。

祝你好运。

【讨论】:

  • 这是在做自己想做的事,但改年真的有必要吗??
  • 好吧,您的查询似乎也对我有用 :-) -- 这只是我过去成功使用的东西。这是您查询的小提琴:sqlfiddle.com/#!2/e5958/59
  • 我现在看到了...我认为问题在于我在当前日期没有活动,因此它没有选择主题。对我感到羞耻..仍然感谢选择正确主题的替代方法。效果很好:)
【解决方案2】:

这样的?

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

See the demo

【讨论】:

  • 一月份这不是问题,但我会使用更通用的(MONTH(BeginDate) &lt; 1 OR (MONTH(BeginDate)=1 AND DAY(BeginDate) &lt; 30))
  • 我试过你的代码,但它似乎对我不起作用。返回 0 行
  • @GertKommer 我认为我们需要在这里重新评估所需的结果。您能否提供您的示例数据应返回的内容?
  • 我希望使用 datetimes 选择当前主题。例如:如果日期是 11-25,那么 sinterklaas 主题应该是返回的行。
  • 啊,你没有提到你想要它基于当前日期:) 给我一些时间。
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2021-05-15
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多