Losing seconds precision when displaying datetime with postgresql
-
wrote on 28 Feb 2022, 11:27 last edited by
Hello!
I have a database with postgresql. I have a table that contains a timestamp column. When I do a query with pgAdmin, it shows the datetime correctly:
But, when I show the result in a QTableView in Qt, I lose the seconds:
This is my code:
QString sROIsQuery = QString("roiID LIKE '\%%1\%'").arg(m_slDataROIs.at(0)); if (m_slDataROIs.size() > 1) { for (int i = 1; i < m_slDataROIs.size(); i++) sROIsQuery.append(QString("OR roiID LIKE '\%%1\%'").arg(m_slDataROIs.at(i))); } QString sDataQuery = QString("dataCode='%1'").arg(m_slData.at(0)); if (m_slData.size() > 1) { for (int i = 1; i < m_slData.size(); i++) sDataQuery.append(QString("OR dataCode='%1'").arg(m_slData.at(i))); } QString sCamerasQuery = QString("cameraID='%1'").arg(m_slDataCameras.at(0).split(" ")[1]); if (m_slDataCameras.size() > 1) { for (int i = 1; i< m_slAlarmsCameras.size(); i++) sCamerasQuery.append(QString("OR cameraID='%1'").arg(m_slDataCameras.at(i).split(" ")[1])); } QString sPresetsQuery = QString("presetID='%1'").arg(m_slDataPresets.at(0).split(" ").last()); if (m_slDataPresets.size() > 1) { for (int i = 1; i < m_slDataPresets.size(); i++) sPresetsQuery.append(QString("OR presetID='%1'").arg(m_slDataPresets.at(i).split(" ").last())); } QString sDateFromQuery = QString("dataDateTime>='%1'").arg(dtDataFrom.toString("yyyy-MM-dd hh:mm:ss")); QString sDateToQuery = QString(" AND dataDateTime<='%1'").arg(dtDataTo.toString("yyyy-MM-dd hh:mm:ss")); QString sDateQuery = sDateFromQuery + sDateToQuery; QString sQuery = QString("SELECT dataCode, cameraSN, cameraID, presetID, roiID, dataDateTime, description, data FROM Data " "WHERE (%1) AND (%2) AND (%3) AND (%4) AND (%5) ORDER BY dataDateTime DESC;").arg(sROIsQuery).arg(sDataQuery).arg(sCamerasQuery).arg(sPresetsQuery).arg(sDateQuery); m_pDataQueryModel->setQuery(*query); ui->tableData->setModel(m_pDataQueryModel); // ui->tableData->horizontalHeader()->setStretchLastSection(true); ui->tableData->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); ui->tableData->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); ui->tableData->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); ui->tableData->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch); ui->tableData->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Stretch); ui->tableData->horizontalHeader()->setSectionResizeMode(5, QHeaderView::Stretch); ui->tableData->horizontalHeader()->setSectionResizeMode(6, QHeaderView::Stretch); ui->tableData->horizontalHeader()->setSectionResizeMode(7, QHeaderView::Stretch);
What could be happening?
Thank you very much!
-
wrote on 28 Feb 2022, 14:50 last edited by mchinand
Create a custom QStyledItemDelegate and reimplement the displayText() method. Check the
QVariant::type()
of the value parameter and if it's of type QDateTime, do your custom formatting otherwise, call the default implementation of the displayText(). I haven't tested this code but it will be something like this:QString CustomDateTimeDelegate::displayText(const QVariant &value, const QLocale &locale){ if (value.type() == QMetaType::QDateTime){ return value.toDateTime().toString("yyyy-MM-dd hh:mm:ss"); } else{ return QStyledItemDelegate::displayText(value, locale); } }
-
Create a custom QStyledItemDelegate and reimplement the displayText() method. Check the
QVariant::type()
of the value parameter and if it's of type QDateTime, do your custom formatting otherwise, call the default implementation of the displayText(). I haven't tested this code but it will be something like this:QString CustomDateTimeDelegate::displayText(const QVariant &value, const QLocale &locale){ if (value.type() == QMetaType::QDateTime){ return value.toDateTime().toString("yyyy-MM-dd hh:mm:ss"); } else{ return QStyledItemDelegate::displayText(value, locale); } }
1/3