1)创建数据库表数据类型
2)存入测试数据(.CSV文件数据导入)
3)tabview显示表数据
4)根据条件查询数据
主要出现在数据库查询部分,但是归根结底还是数据库time类型的问题(varchar)
刚开始数据库表为:
可以看到time数据类型varchar时,数据存入格式为2018/4/28即为yyyy/m/dd、yyyy/m/dd、yyyy/mm/d、yyyy/mm/dd四种格式。问题就出在这。由于数据库查询时语句采用的是QString字符串匹配,代码为
char *ch;
QSqlQueryModel *mod = new QSqlQueryModel(this);
QDate dateEdit=ui->dateEdit->date();
QString date=dateEdit.toString("yyyy/MM/dd");
qDebug()<<"日期:"<
QByteArray ba=date.toLatin1();
ch=ba.data();
qDebug()<<"日期:"<
mod->setQuery(QString("select * from hdata1 where time = '%1'").arg(ch));
qDebug()<<"转换"<
if (mod->lastError().isValid())
qDebug() << mod->lastError();
ui->tableView->setModel(mod);
这里就有一个问题了,当我们真正查询时,会发现查询的是这个:
日期: "2018/04/29"
日期: 2018/04/29
转换 "select * from hdata where time ='2018/04/29'"
刚开始我没有注意到时间上的区别,后来仔细一想,还是和时间time的类型varchar有关系,它是按字符形式来匹配的,
因此按字符形式匹配时,‘2018/4/29’与‘2018/04/29’是不相同的。
这是最后才想到的问题,一点点小问题搞得怀疑自我了,真的不能忽视细节!
最后代码语句没有更改,将数据库内容更改了,一下子就查出来了!
查询结果:
第一、就是不同数据库数据类型,不同数据类型如何选择类型,本文的时间其实 用date更好,在mysql中使用datetime都会自动转换,而不是在这里设计到字符的问题了。当初也是字符出错,处理方式虽然对了,但是还是数据库类型不一致,导致后来没有察觉到。
void HData::on_pushButton_clicked()
{
char *ch0;
char *ch1;
char *ch2;
QSqlQueryModel *mod = new QSqlQueryModel(this);
QDate dateEdit=ui->dateEdit->date();
QString date=dateEdit.toString("yyyy/MM/dd");
QStringList list = date.split("/");//QString字符串分割函数
// qDebug()<<"日期:"<
// QByteArray ba=date.toLatin1();
// ch=ba.data();
// qDebug()<<"日期:"<
// qDebug()<
QByteArray ba0=list[0].toLatin1();
QByteArray ba1=list[1].toLatin1();
QByteArray ba2=list[2].toLatin1();
ch0=ba0.data();
qDebug()<
ch1=ba1.data();
qDebug()<
ch2=ba2.data();
qDebug()<
mod->setQuery(QString("select * from hdata where time=%1/%2/%3").arg(ch0).arg(ch1).arg(ch2));
if (mod->lastError().isValid())
qDebug() << mod->lastError();
ui->tableView->setModel(mod);
}
对QString字符串的分割有了深入的理解!
第二、对数据库数据段时间查询,有了深入的理解,同时知道了数据库这方面还是有点薄弱(不太常用数据库),下面就需要搞基本数据库的书,结合项目深入探索一下,很爽的感觉!(方向:分布式数据库技术要掌握)
一些基本的段时间查询语句总结如下:
select * from tongji where [销售时间]=date('now','localtime') --当天
select * from tongji where strftime('%Y%m',[销售时间])=strftime('%Y%m','now','localtime') --当月
select * from tongji where strftime('%Y',[销售时间])=strftime('%Y','now','localtime') --当年
对于项目中取变量数据查询,需要QString匹配:
setQuery(QString("select * from hdata1 where time = '%1'").arg(ch));
QString SqlStr = QString("time > '%1' and time < '%2'").arg(startDateTime).arg(endDateTime);
QString SqlStr = QString("select * from hdata where time between '%1' and '2%'").arg(startDateTime).arg(endDateTime);
model->setFilter(SqlStr);//按这个方式查询
model->select();
第三,QSQLITE数据类型(摘取一些)
获取的时间函数date():
写了这篇文章,目的是也希望遇到同样问题的朋友,有一个参考解决的方法!
不至于像我这样摸索半天,浪费时间!毕竟时间很宝贵!