我正在使用php和mysql。我有一个包含如下数据的表格,
Id Name SDate
1 AS 12-11-2017
2 SA 11-11-2017
3 Sw 10-11-2017
和每列的数据类型是
Id int
Name Varchar
SDate Varchar
我在10-11-2017到11-11-2017之间选择数据,如下所示,
select * from testtable where sdate between '11-11-2017' and '12-11-2017'
结果为空
但是当我选择如下时,
select * from testtable where sdate='11-11-2017';
结果即将到来
我无法将SDate列更改为日期,因为有1000万条记录
答案 0 :(得分:1)
我将在答案前写道,absolutley应该改变表格中的数据类型。我将要为您提供的这个答案将起作用,但由于每次运行此查询时需要转换表中的每条记录,因此效率极低。
无论如何,mysql中有一个名为str_to_date(docs)的函数。有了它,您可以在查询时将varchar转换为日期,因此以下查询应该足够了:
select
*
from
testtable
where
str_to_date(sdate, '%d-%m-%Y') between str_to_date('11-11-2017', '%d-%m-%Y') and str_to_date('12-11-2017', '%d-%m-%Y')
答案 1 :(得分:1)
您可以使用STR_TO_DATE
例如,您的查询可能如下所示:
select * from testtable where STR_TO_DATE(sdate, '%d-%m-%Y') between STR_TO_DATE('11-11-2017', '%d-%m-%Y') and STR_TO_DATE('12-11-2017', '%d-%m-%Y');
但你需要检查一下,我是从记忆中写的。
答案 2 :(得分:0)
正如Faytraneozter所说,你绝不应该使用VARCHAR作为DATE列的替代品。 Varchar显然被视为一个字符串,因此使用> =,< =或BETWEEN将导致进行字符串比较,这不是你想要的。
如果VARCHAR是绝对必需的,您应该使用'YYYYMMDD'格式,这至少会为您提供一些比较值的余地。 (在您的情况下,不清楚您的格式是MM-DD-YYYY还是DD-MM-YYYY ......)
否则,您应该考虑从此表创建一个VIEW。语法如下:
True
然后,创建视图后,通常将其用作:
CREATE VIEW mynewview AS
SELECT id, name, str_to_date(`date`, '%d-%m-%Y') AS date2 FROM mytable;