diff --git a/moor/lib/src/dsl/columns.dart b/moor/lib/src/dsl/columns.dart index beb8a193..ea3cdeda 100644 --- a/moor/lib/src/dsl/columns.dart +++ b/moor/lib/src/dsl/columns.dart @@ -22,7 +22,8 @@ abstract class TextColumn extends Column { /// A column that stores a [DateTime]. Times will be stored as unix timestamp /// and will thus have a second accuracy. -abstract class DateTimeColumn extends Column {} +abstract class DateTimeColumn extends Column + implements DateTimeExpression {} /// A column that stores arbitrary blobs of data as a [Uint8List]. abstract class BlobColumn extends Column {} diff --git a/moor/lib/src/runtime/expressions/comparable.dart b/moor/lib/src/runtime/expressions/comparable.dart index 281020dd..dc112a0c 100644 --- a/moor/lib/src/runtime/expressions/comparable.dart +++ b/moor/lib/src/runtime/expressions/comparable.dart @@ -7,6 +7,9 @@ abstract class IntExpression extends Expression abstract class DoubleExpression extends Expression implements ComparableExpr {} +abstract class DateTimeExpression extends Expression + implements ComparableExpr {} + mixin ComparableExpr> on Expression { /// Returns an expression that is true if this expression is strictly bigger /// than the other expression. diff --git a/moor/lib/src/runtime/expressions/datetimes.dart b/moor/lib/src/runtime/expressions/datetimes.dart index 31d21870..853a7a94 100644 --- a/moor/lib/src/runtime/expressions/datetimes.dart +++ b/moor/lib/src/runtime/expressions/datetimes.dart @@ -35,13 +35,19 @@ Expression second(Expression date) => /// A sql expression that evaluates to the current date represented as a unix /// timestamp. The hour, minute and second fields will be set to 0. -const Expression currentDate = - CustomExpression("strftime('%s', CURRENT_DATE)"); +const DateTimeExpression currentDate = + _CustomDateTimeExpression("strftime('%s', CURRENT_DATE)"); /// A sql expression that evaluates to the current date and time, similar to /// [DateTime.now]. Timestamps are stored with a second accuracy. -const Expression currentDateAndTime = - CustomExpression("strftime('%s', CURRENT_TIMESTAMP)"); +const DateTimeExpression currentDateAndTime = + _CustomDateTimeExpression("strftime('%s', CURRENT_TIMESTAMP)"); + +class _CustomDateTimeExpression extends CustomExpression + with ComparableExpr + implements DateTimeExpression { + const _CustomDateTimeExpression(String content) : super(content); +} /// Expression that extracts components out of a date time by using the builtin /// sqlite function "strftime" and casting the result to an integer. diff --git a/moor/lib/src/runtime/structure/columns.dart b/moor/lib/src/runtime/structure/columns.dart index e3cebb37..863bf3b4 100644 --- a/moor/lib/src/runtime/structure/columns.dart +++ b/moor/lib/src/runtime/structure/columns.dart @@ -201,6 +201,7 @@ class GeneratedIntColumn extends GeneratedColumn } class GeneratedDateTimeColumn extends GeneratedColumn + with ComparableExpr implements DateTimeColumn { GeneratedDateTimeColumn( String $name, diff --git a/moor/test/columns/datetime_test.dart b/moor/test/columns/datetime_test.dart index 00f0f07c..d8faf58a 100644 --- a/moor/test/columns/datetime_test.dart +++ b/moor/test/columns/datetime_test.dart @@ -15,4 +15,11 @@ void main() { expect(nullableQuery.sql, equals('name INTEGER NULL')); expect(nonNullQuery.sql, equals('name INTEGER NOT NULL')); }); + + test('can compare', () { + final ctx = GenerationContext(null, null); + nonNull.isSmallerThan(currentDateAndTime).writeInto(ctx); + + expect(ctx.sql, 'name < strftime(\'%s\', CURRENT_TIMESTAMP)'); + }); }