数据库使用:QSQLITE
数据库建立:
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()<<"日期:"<<date; QByteArray ba=date.toLatin1(); ch=ba.data(); qDebug()<<"日期:"<<ch;mod->setQuery(QString("select * from hdata1 where time = '%1'").arg(ch));
qDebug()<<"转换"<<QString("select * from hdata where time ='%1'").arg(ch); 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()<<"日期:"<<date;// QByteArray ba=date.toLatin1();// ch=ba.data();// qDebug()<<"日期:"<<ch;// qDebug()<<list[i]<<endl; QByteArray ba0=list[0].toLatin1(); QByteArray ba1=list[1].toLatin1(); QByteArray ba2=list[2].toLatin1(); ch0=ba0.data(); qDebug()<<ch0; ch1=ba1.data(); qDebug()<<ch1; ch2=ba2.data(); qDebug()<<ch2; 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():

写了这篇文章,目的是也希望遇到同样问题的朋友,有一个参考解决的方法!
不至于像我这样摸索半天,浪费时间!毕竟时间很宝贵!
本文探讨了在QSQLITE数据库中使用VARCHAR作为时间类型时出现的问题,包括数据不匹配和查询困难等,并提供了解决方案,即更改数据格式。
1234

被折叠的 条评论
为什么被折叠?



