【问题标题】:How to use Qt 5 datetime data to query Sqlite3 using Python3 and PyQt5如何使用 Qt 5 日期时间数据使用 Python 和 PyQt5 查询 Sqlite3
【发布时间】:2017-07-05 04:08:42
【问题描述】:

我有一个带有两个 QDateTimeEdit 控件的 Qt 表单。当用户按下 SEARCH 按钮时,我想在 sqlite3 SELECT 语句的 WHERE 子句中使用这些日期和时间。但是我不知道如何从 QDateTime 对象中提取日期和时间组件,以便构造 Sqlite 需要的儒略日期。

我花了很多时间阅读和重读 PyQt5 参考指南链接到的 Qt C++ 类参考文档并尝试不同的事情,包括尝试使用 QVariant 进行各种转换,但都无济于事。在我看来,QString QDateTime::toString(const QString &format)const 方法是我需要使用的,但 PyQt5 绑定似乎不包括 QString 或 toString 方法?我遇到了一个帖子,似乎证实了这种方法是我需要的,但它指的是 PyQt4。是否有可能在 PyQt5 版本中放弃了对这种方法的支持?

【问题讨论】:

  • 您能解释一下您是如何在 sqlite 中创建表格的吗?
  • 我使用开源免费软件“DB Browser for SQLite”工具来创建数据库及其架构。我有一个 python 程序,我定期运行它来向数据库添加数据。
  • 试试我的答案,如果你没有忘记将其标记为正确,请。

标签: python python-3.x qt pyqt pyqt5


【解决方案1】:

根据documentation

日期和时间函数使用 IS0-8601 日期和时间的子集 格式。 date() 函数以这种格式返回日期: YYYY-MM-DD。 time() 函数以 HH:MM:SS 形式返回时间。 该 datetime() 函数返回“YYYY-MM-DD HH:MM:SS”。朱利安日() 函数返回儒略日 - 自中午以来的天数 格林威治,公元前 4714 年 11 月 24 日(预测公历)。 strftime() 例程返回根据 指定为第一个参数的格式字符串。格式字符串 支持 strftime() 中最常见的替换 标准 C 库中的函数加上两个新的替换,%f 和%J。以下是有效 strftime() 的完整列表 换人:

时间数据类型的格式必须是YYYY-MM-DD HH:MM:SS,在Qt中(因此在PyQt中)我们可以使用toString函数得到它:

QDateTime.toString("yyyy-MM-dd hh:mm:ss")

例子:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtSql import *
import sys

def createConnection():
    db = QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('memory')
    if not db.open():
        QMessageBox.critical(None, qApp.tr("Cannot open database"),
                             qApp.tr("Unable to establish a database connection.\n"
                                     "This example needs SQLite support. Please read "
                                     "the Qt SQL driver documentation for information "
                                     "how to build it.\n\n"
                                     "Click Cancel to exit."),
                             QMessageBox.Cancel)
        return False

    query = QSqlQuery()
    query.exec_("create table test(id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, dt DATETIME default current_timestamp)")

    query.exec_("insert into test (dt) values('2007-01-01 10:00:00')")
    query.exec_("insert into test (dt) values('2008-01-01 10:00:00')")
    query.exec_("insert into test (dt) values('2009-01-01 10:00:00')")
    query.exec_("insert into test (dt) values('2010-01-01 10:00:00')")
    return True

class Widget(QWidget):
    def __init__(self, change_cursor=True, parent=None):
        QWidget.__init__(self, parent=parent)
        layout = QHBoxLayout(self)
        self.fromDateTE = QDateTimeEdit()
        self.toDateTE = QDateTimeEdit()
        layout.addWidget(self.fromDateTE)
        layout.addWidget(self.toDateTE)
        btn = QPushButton("Select")
        layout.addWidget(btn)
        btn.clicked.connect(self.onClick)

    def onClick(self):
        _from = self.fromDateTE.dateTime().toString("yyyy-MM-dd hh:mm:ss")
        _to = self.toDateTE.dateTime().toString("yyyy-MM-dd hh:mm:ss")
        sql = "SELECT * from test WHERE dt BETWEEN datetime('{}') AND datetime('{}')".format(_from, _to)
        query = QSqlQuery(sql)
        while query.next():
            print(query.value(1))

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    if not createConnection():
        sys.exit(1)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

如果我们将日期如下图所示放置,我们会得到如下所示的结果。

截图:

输出:

2008-01-01 10:00:00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2018-05-01
    • 2022-10-31
    • 1970-01-01
    • 2018-04-28
    • 2019-08-18
    相关资源
    最近更新 更多