-2

我有一个巨大的数据,日期为字符串。

列名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'

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

4

2 回答 2

1

学习为列使用正确的类型。也许您被其他人将日期/时间存储为字符串的非常糟糕的决定所困扰。也许你无法改变这一点。但是,在查询中,使用正确的类型!

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';

这将作为日期而不是字符串进行比较。

于 2017-07-16T14:09:14.023 回答
1

时间戳字符串14-Mar-2016 05:44:38pm可以使用STR_TO_DATE()格式字符串转换为日期时间%d-%b-%Y %r。然后,我们可以通过用 包裹它来仅获取日期部分DATE()。看看这里的演示,看看这是否有效

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不是。

于 2017-07-16T14:11:13.650 回答