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

时间:2010-08-12 19:07:28

标签: sql mysql

我想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

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

我根本不关心时间我只需要日期

reporttimedate字段

这不起作用:

SELECT * FROM batchinfo 
 where cast(reporttime as date) between ('7/28/10' and '7/29/10')

这样:

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

正在回归:

Truncated incorrect datetime value: '7/8/2010 11:47 AM'
Incorrect datetime value: '0.00012009' for function str_to_date

这样:

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

正在回归:

Incorrect datetime value: '7/8/2010 11:47 AM' for function str_to_date

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

现在我得到了回复:

Incorrect datetime value: '7/8/2010' for function str_to_date

6 个答案:

答案 0 :(得分:8)

使用STR_TO_DATE to convert the strings to the DateTime data type。格式简写可在DATE_FORMAT下找到:

STR_TO_DATE(column, '%m/%/d/%Y %h:%i:%s %p')

问题是,您必须先将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')

日期格式不一致(有些使用连字符,其他斜线和年/月/日顺序可能完全不同......),因此STR_TO_DATE是最适应的&将字符串转换为DateTime的一致方法。只有在值为DateTime之后,日期/时间功能才会像DATE()一样可用,只获取日期部分......

由于数据类型的改变,some_date&的索引。不能使用another_date列。

答案 1 :(得分:8)

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

此类解决方案的性能将得到提升。

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

答案 2 :(得分:1)

如果您使用的是SQl,请使用此查询

数据

DECLARE @Dates TABLE (StartDate varchar(100));

INSERT INTO @Dates VALUES ('7/1/2010 9:10 AM');
INSERT INTO @Dates VALUES ('7/5/2010 10:33 AM');
INSERT INTO @Dates VALUES ('7/13/2010 04:53 AM');
INSERT INTO @Dates VALUES ('7/22/2010 8:45 AM');
INSERT INTO @Dates VALUES ('7/10/2010 11:20 AM');
INSERT INTO @Dates VALUES ('7/11/2010 12:40 AM');

查询:

SELECT * FROM @Dates
WHERE (CONVERT(datetime,StartDate,101) >= CONVERT(datetime,'7/1/2010 9:10 AM',101))
                                         AND (CONVERT(datetime,StartDate,101) <= CONVERT(datetime,'7/15/2010 9:10 AM',101))
ORDER BY CONVERT(datetime,StartDate,101)

答案 3 :(得分:0)

您可以将您的varchar值CAST设置为DATETIME或DATE类型。

WHERE CAST(dates AS DATE) BETWEEN (7/28/10 and 7/29/10)

这可能不是最佳解决方案,因为您可能会失去索引提供的好处。

答案 4 :(得分:0)

此日期查询将完美运行...

Database 'Date' Will be like '01/01/2016' and datatype is 'varchar'

SELECT * FROM `test` WHERE STR_TO_DATE(`test`.`date`, '%d/%m/%Y') BETWEEN '2016-01-01' AND '2016-01-31' ORDER BY `test`.`date` ASC

答案 5 :(得分:0)

如果日期在Varchar中

查询 AND c.sentdate&gt; '2016君-15'