我想要 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)
使用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列的索引.
您想要在日期之间进行搜索,将它们存储为日期.通过将它们存储为琴弦,你可以将自己拍摄在脚下.您基本上需要从字符串中提取日期部分(使用SUBSTR()或LEFT())并将其解析为日期格式(使用STR_TO_DATE()).
这种解决方案的性能将是适合的.
STR_TO_DATE(LEFT(reporttime,LOCATE(' ',reporttime)),'%m/%d/%Y') BETWEEN '2010-07-28' AND '2010-07-29'