mysql:搜索存储为varchar的BETWEEN日期

l--*_*''' 9 mysql sql

我想要 select * from table where dates between (some_date and another_date)

问题是日期存储为varchar!

以下是我所拥有的日期示例:

7/29/2010 9:53 AM
7/16/2010 7:57:39 AM
Run Code Online (Sandbox Code Playgroud)

请注意,有些记录有秒,有些则没有

我根本不在乎时间,只需要约会

reporttime是这个date领域

这不起作用:

SELECT * FROM batchinfo 
 where cast(reporttime as date) between ('7/28/10' and '7/29/10')
Run Code Online (Sandbox Code Playgroud)

这个:

SELECT * from batchinfo WHERE reporttime BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y %h:%i:%s %p')
                AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y %h:%i:%s %p')
Run Code Online (Sandbox Code Playgroud)

正在回归:

Truncated incorrect datetime value: '7/8/2010 11:47 AM'
Incorrect datetime value: '0.00012009' for function str_to_date
Run Code Online (Sandbox Code Playgroud)

这个:

SELECT * from batchinfo WHERE STR_TO_DATE(reporttime, '%m/%/d/%Y %h:%i:%s %p') BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y')
                                                           AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y')
Run Code Online (Sandbox Code Playgroud)

正在回归:

Incorrect datetime value: '7/8/2010 11:47 AM' for function str_to_date
Run Code Online (Sandbox Code Playgroud)

OMG PONIES:

我在第一个空白之前拿走了所有东西:

SELECT * from batchinfo WHERE STR_TO_DATE(LEFT(reporttime,LOCATE(' ',reporttime)), '%m/%/d/%Y') BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y')
                                                           AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y')
Run Code Online (Sandbox Code Playgroud)

现在我得到了这个回复:

Incorrect datetime value: '7/8/2010' for function str_to_date
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 8

使用STR_TO_DATE将字符串转换为DateTime数据类型.格式简写可在DATE_FORMAT下找到:

STR_TO_DATE(column, '%m/%/d/%Y %h:%i:%s %p')
Run Code Online (Sandbox Code Playgroud)

问题是,在使用之前,您必须先将 VARCHAR日期更新为所有格式相同的格式 :

WHERE STR_TO_DATE(reporttime, '%m/%/d/%Y %h:%i:%s %p') BETWEEN STR_TO_DATE(some_date, '%m/%/d/%Y')
                                                           AND STR_TO_DATE(another_date, '%m/%/d/%Y')
Run Code Online (Sandbox Code Playgroud)

日期格式不一致(一些使用连字符,其他斜杠和年/月/日顺序可能完全不同......),因此STR_TO_DATE是将字符串转换为DateTime的最容易和最一致的方法.仅在值为DateTime之后,日期/时间功能是否可用,如DATE()仅获取日期部分...

由于数据类型更改,不能使用some_date和another_date列的索引.


Mch*_*chl 8

您想要在日期之间进行搜索,将它们存储为日期.通过将它们存储为琴弦,你可以将自己拍摄在脚下.您基本上需要从字符串中提取日期部分(使用SUBSTR()LEFT())并将其解析为日期格式(使用STR_TO_DATE()).

这种解决方案的性能将是适合的.

STR_TO_DATE(LEFT(reporttime,LOCATE(' ',reporttime)),'%m/%d/%Y') BETWEEN '2010-07-28' AND '2010-07-29'