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

37 篇文章 1 订阅

数据库使用: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():



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

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

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt中,可以使用Qt的SQL模块来查询数据库数据表。下面是一个简单的介绍和示例代码: 1. 首先,需要在.pro文件中添加对Qt SQL模块的引用。在.pro文件中添加以下代码: ``` QT += sql ``` 2. 在源代码中,需要包含相关的头文件和命名空间: ```cpp #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug> ``` 3. 建立数据库连接并执行查询操作。下面是一个示例代码: ```cpp // 建立数据库连接 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); // 数据库服务器地址 db.setDatabaseName("database_name"); // 数据库名称 db.setUserName("username"); // 用户名 db.setPassword("password"); // 密码 // 打开数据库 if (!db.open()) { qDebug() << "数据库打开失败:" << db.lastError().text(); return; } // 执行查询操作 QString queryStr = "SELECT * FROM table_name"; QSqlQuery query; if (!query.exec(queryStr)) { qDebug() << "查询失败:" << query.lastError().text(); db.close(); return; } // 处理查询结果 while (query.next()) { QString column1 = query.value(0).toString(); // 获取第一列数据 QString column2 = query.value(1).toString(); // 获取第二列数据 // ... qDebug() << column1 << column2; } // 关闭数据库连接 db.close(); ``` 上述示例代码中,通过`QSqlDatabase`建立数据库连接,使用`QSqlQuery`执行查询操作,并通过`query.next()`和`query.value()`获取查询结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值