Qt之数据库查询问题总结(查询变量time数据)

数据库使用:QSQLITE

数据库建立:

1)创建数据库表数据类型 

2)存入测试数据(.CSV文件数据导入)

3)tabview显示表数据

4)根据条件查询数据


遇见问题总结:

主要出现在数据库查询部分,但是归根结底还是数据库time类型的问题(varchar)

刚开始数据库表为:

Qt之数据库查询问题总结(查询变量time数据)_第1张图片

可以看到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’是不相同的。

这是最后才想到的问题,一点点小问题搞得怀疑自我了,真的不能忽视细节!

最后代码语句没有更改,将数据库内容更改了,一下子就查出来了!

Qt之数据库查询问题总结(查询变量time数据)_第2张图片

查询结果:

Qt之数据库查询问题总结(查询变量time数据)_第3张图片

当然,遇到了问题不仅仅是解决了问题,同时也加深了我对其他问题的理解;

第一、就是不同数据库数据类型,不同数据类型如何选择类型,本文的时间其实 用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数据类型(摘取一些)

Qt之数据库查询问题总结(查询变量time数据)_第4张图片

Qt之数据库查询问题总结(查询变量time数据)_第5张图片

Qt之数据库查询问题总结(查询变量time数据)_第6张图片

获取的时间函数date():

Qt之数据库查询问题总结(查询变量time数据)_第7张图片


写了这篇文章,目的是也希望遇到同样问题的朋友,有一个参考解决的方法!

不至于像我这样摸索半天,浪费时间!毕竟时间很宝贵!

你可能感兴趣的:(2.,QT,1.,C++)