我想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
请注意,有些记录有秒,有些则没有
我根本不关心时间我只需要日期
reporttime
是date
字段
这不起作用:
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
答案 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'