比较MYSQL中不同数据类型的日期

时间:2013-12-09 14:13:34

标签: mysql database date

面对一个奇怪的问题。我已经在我的数据库中存储了一个失效日期 Varchar (由于日历插件)。我现在必须检查表中的过期项目。 所以我编写了这个SQL,首先将varchar(string)转换为日期格式,然后与当前时间进行比较。

  SELECT date_format(str_to_date(discountEndDT,'%m/%d/%Y'), '%m/%d/%Y') as dateSale
  FROM tbl_salestemplate where date_format(str_to_date(discountEndDT,'%m/%d/%Y'),'%m/%d/%Y')>DATE_FORMAT(NOW(),'%m/%d/%Y')

现在这给了我结果,但仅限于截至2013年的到期日。我在2014年到期的日期即使超过今天也不会返还。

不确定我做错了什么。如果我运行一个独立查询来获取所有到期日期,我会得到所有日期,包括2014年到期年份的日期,以预期的m/d/y格式。 独立查询是:

 SELECT *FROM tbl_salestemplate Wheredate_format(str_to_date(discountEndDT,'%m/%d/%Y'), '%m/%d/%Y')

我哪里出错了?有人可以纠正吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

尝试此查询:

SELECT date_format(str_to_date(discountEndDT,'%m/%d/%Y'), '%m/%d/%Y') as dateSale
FROM tbl_salestemplate 
where str_to_date(discountEndDT,'%m/%d/%Y')>NOW()
;

甚至是这样:

SELECT discountEndDT as dateSale
FROM tbl_salestemplate 
where str_to_date(discountEndDT,'%m/%d/%Y')>NOW()
;

因为转换date_format(str_to_date(discountEndDT,'%m/%d/%Y'), '%m/%d/%Y')实际上将字符串m / d / yyyy转换为日期,然后转换回相同的字符串m / d / yyyy。

看到此演示:http://www.sqlfiddle.com/#!2/59536/5


您的查询不是比较真实日期,而是比较格式的字符串:m / d / yyyy,其中m是月份数。

看看演示中第二个查询的结果 例如,日期“03/15/2014”比“12/09/2013”​​更好,但字符串“03 ...”小于“12 ......”,因此您会得到意想不到的结果。