mysql 日期比较无效无法找到问题

mysql date comparision is not working unable to find the issue

我有大量日期为字符串的数据。

栏目名称date1

数据类型varchar

存储的数据格式如下:14-Mar-2016 05:44:38pm

现在我只从这个字符串中拆分了日期,如下所示:14-03-2016

通过使用这个:DATE_FORMAT(STR_TO_DATE(gr.date1, '%d-%M-%Y'),'%d-%m-%Y')

现在我正在尝试将日期与此查询进行比较:

SELECT * FROM 
( SELECT date1,DATE_FORMAT(STR_TO_DATE(date1, '%d-%M-%Y'),'%d-%m-%Y') as dateFormatted
 FROM `grabt` ) as mTbl WHERE mTbl.dateFormatted >= '19-01-2016' 
 AND mTbl.dateFormatted <= '25-01-2016'

但它不工作可能是什么错误。?

学习使用正确的列类型。也许您对其他人将 date/times 存储为字符串的非常糟糕的决定感到困惑。也许你无法改变这一点。但是,在查询中,使用正确的类型!

SELECT mTbl.*,
       LEFT(date1, 10) as FormattedDate  -- Is this really necessary?
FROM (SELECT date1,
             STR_TO_DATE(LEFT(date1, 10), '%d-%M-%Y') as thedate
      FROM `grabt`
     ) mTbl
WHERE mTbl.thedate >= '2016-01-19' AND
      mTbl.thedate <= '2016-01-25';

这将作为 dates 而不是 strings.

进行比较

可以使用 STR_TO_DATE() 以及格式字符串 %d-%b-%Y %r 将时间戳字符串 14-Mar-2016 05:44:38pm 转换为日期时间。然后我们可以通过用 DATE() 包装它来仅获取日期部分。看看这里 for a demo to see that this works.

SELECT *
FROM
(
    SELECT DATE(STR_TO_DATE(date1, '%d-%b-%Y %r')) AS dateFormatted
    FROM grabt
) AS mTbl
WHERE mTbl.dateFormatted BETWEEN '2016-01-19' AND '2016-01-25'

正如 Gordon 已经指出的那样,理想情况下,您应该使用日期类型而不是字符串来计算日期。顺便说一句,在 WHERE 子句中进行比较时,请使用有效的日期字符串。 YYYY-MM-DD 是有效格式,例如2016-01-19,但 19-01-2016 不是。