2017-07-05 32 views
0

我有一個QT窗體和兩個QDateTimeEdit控件。我想在用戶按下SEARCH按鈕時在sqlite3 SELECT語句的WHERE子句中使用這些日期和時間。但我無法弄清楚如何從QDateTime對象中提取日期和時間組件,以便構建Sqlite需要的Julian日期。如何使用Qt 5日期時間數據來使用Python3和PyQt5查詢Sqlite3

我花了很多時間閱讀和重新閱讀PyQt5參考指南鏈接到的Qt C++類參考文檔,嘗試不同的東西,包括嘗試使用QVariant進行各種轉換,但都無濟於事。在我看來,QString QDateTime::toString(const QString &format)const方法是我需要使用但PyQt5綁定似乎不包括QString或toString方法?我偶然發現一篇文章,似乎證實這種方法是我需要的,但它指的是PyQt4。在PyQt5版本中是否有可能對此方法提供支持?

+0

你能解釋一下你怎麼SQLite中創建的表? – eyllanesc

+0

我使用了開源免費軟件「DB Browser for SQLite」工具來創建數據庫及其模式。我有一個python程序,我經常運行將數據添加到數據庫。 –

+0

試試我的答案,如果你不忘記標記爲正確的請。 – eyllanesc

回答

1

按照documentation

的日期和時間函數使用IS0-8601日期和時間 格式的子集。 date()函數以這種格式返回日期: YYYY-MM-DD。 time()函數將時間返回爲HH:MM:SS。 datetime()函數返回「YYYY-MM-DD HH:MM:SS」。 julianday() 函數返回Julian日 - 從中​​午12時47分開始的天數在格林威治 中的天數。 (普萊爾格里曆)。 strftime()例程返回根據指定爲第一個參數的 格式字符串格式化的日期。格式字符串 支持來自標準C庫的strftime() 函數中的最常見替換以及兩個新替換(%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_()) 

如果我們把日期如圖所示如下圖,我們得到如下圖所示的結果。

截圖:

enter image description here

輸出:

2008-01-01 10:00:00 
相關問題