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
不是。
我有大量日期为字符串的数据。
栏目名称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
不是。