Mysql之间的查询不起作用

时间:2017-12-11 11:18:14

标签: mysql

我正在使用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万条记录

3 个答案:

答案 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;