Skip to content

Commit 4f11d8b

Browse files
committedMay 8, 2020
Use make_datetime instead of string based date expressions
1 parent bcbfc5e commit 4f11d8b

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed
 

‎src/core/qgsvectorlayertemporalproperties.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,12 @@ void QgsVectorLayerTemporalProperties::setEndField( const QString &field )
153153

154154
QString dateTimeExpressionLiteral( const QDateTime &datetime )
155155
{
156-
// TODO - we should add a dedicated expression function for optimised datetime value creation
157-
// which doesn't rely on string conversion!
158-
// e.g. datetime(2012,5,4,12,15,0)
159-
160-
return QStringLiteral( "to_datetime('%1','yyyy-MM-ddTHH:mm:ss.zzz')" ).arg( datetime.toString( QStringLiteral( "yyyy-MM-ddTHH:mm:ss.zzz" ) ) );
156+
return QStringLiteral( "make_datetime(%1,%2,%3,%4,%5,%6)" ).arg( datetime.date().year() )
157+
.arg( datetime.date().month() )
158+
.arg( datetime.date().day() )
159+
.arg( datetime.time().hour() )
160+
.arg( datetime.time().minute() )
161+
.arg( datetime.time().second() + datetime.time().msec() / 1000.0 );
161162
}
162163

163164
QString QgsVectorLayerTemporalProperties::createFilterString( QgsVectorLayer *, const QgsDateTimeRange &range ) const

‎tests/src/python/test_qgsvectorlayertemporalproperties.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@ def testSingleFieldMode(self):
7878
self.assertFalse(props.createFilterString(layer, range))
7979

8080
props.setIsActive(True)
81-
self.assertEqual(props.createFilterString(layer, range), '''"start_field" >= to_datetime('2019-03-04T11:12:13.000','yyyy-MM-ddTHH:mm:ss.zzz') AND "start_field" <= to_datetime('2020-05-06T08:09:10.000','yyyy-MM-ddTHH:mm:ss.zzz')''')
81+
self.assertEqual(props.createFilterString(layer, range), '"start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)')
8282

8383
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False)
84-
self.assertEqual(props.createFilterString(layer, range), '''"start_field" > to_datetime('2019-03-04T11:12:13.000','yyyy-MM-ddTHH:mm:ss.zzz') AND "start_field" <= to_datetime('2020-05-06T08:09:10.000','yyyy-MM-ddTHH:mm:ss.zzz')''')
84+
self.assertEqual(props.createFilterString(layer, range), '"start_field" > make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)')
8585

8686
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False)
87-
self.assertEqual(props.createFilterString(layer, range), '''"start_field" >= to_datetime('2019-03-04T11:12:13.000','yyyy-MM-ddTHH:mm:ss.zzz') AND "start_field" < to_datetime('2020-05-06T08:09:10.000','yyyy-MM-ddTHH:mm:ss.zzz')''')
87+
self.assertEqual(props.createFilterString(layer, range), '"start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)')
8888

8989
def testDualFieldMode(self):
9090
layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime&field=end_field:datetime", "test", "memory")
@@ -101,13 +101,13 @@ def testDualFieldMode(self):
101101
self.assertFalse(props.createFilterString(layer, range))
102102

103103
props.setIsActive(True)
104-
self.assertEqual(props.createFilterString(layer, range), '''"start_field" >= to_datetime('2019-03-04T11:12:13.000','yyyy-MM-ddTHH:mm:ss.zzz') AND "end_field" <= to_datetime('2020-05-06T08:09:10.000','yyyy-MM-ddTHH:mm:ss.zzz')''')
104+
self.assertEqual(props.createFilterString(layer, range), '"start_field" >= make_datetime(2019,3,4,11,12,13) AND "end_field" <= make_datetime(2020,5,6,8,9,10)')
105105

106106
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False)
107-
self.assertEqual(props.createFilterString(layer, range), '''"start_field" > to_datetime('2019-03-04T11:12:13.000','yyyy-MM-ddTHH:mm:ss.zzz') AND "end_field" <= to_datetime('2020-05-06T08:09:10.000','yyyy-MM-ddTHH:mm:ss.zzz')''')
107+
self.assertEqual(props.createFilterString(layer, range), '"start_field" > make_datetime(2019,3,4,11,12,13) AND "end_field" <= make_datetime(2020,5,6,8,9,10)')
108108

109109
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False)
110-
self.assertEqual(props.createFilterString(layer, range), '''"start_field" >= to_datetime('2019-03-04T11:12:13.000','yyyy-MM-ddTHH:mm:ss.zzz') AND "end_field" < to_datetime('2020-05-06T08:09:10.000','yyyy-MM-ddTHH:mm:ss.zzz')''')
110+
self.assertEqual(props.createFilterString(layer, range), '"start_field" >= make_datetime(2019,3,4,11,12,13) AND "end_field" < make_datetime(2020,5,6,8,9,10)')
111111

112112

113113
if __name__ == '__main__':

0 commit comments

Comments
 (0)
Please sign in to comment.