diff --git a/src/EFCore.PG.NodaTime/Query/Internal/NpgsqlNodaTimeMemberTranslatorPlugin.cs b/src/EFCore.PG.NodaTime/Query/Internal/NpgsqlNodaTimeMemberTranslatorPlugin.cs index 649f9afa0..376723018 100644 --- a/src/EFCore.PG.NodaTime/Query/Internal/NpgsqlNodaTimeMemberTranslatorPlugin.cs +++ b/src/EFCore.PG.NodaTime/Query/Internal/NpgsqlNodaTimeMemberTranslatorPlugin.cs @@ -251,10 +251,13 @@ SqlExpression Upper() if (member == DateInterval_End) { - return - _sqlExpressionFactory.Subtract( + var upperBound = _sqlExpressionFactory.Subtract( Upper(), _sqlExpressionFactory.Constant(Period.FromDays(1), _periodTypeMapping)); + + // PostgreSQL creates a result of type 'timestamp without time zone' when subtracting periods from dates. + // So we need to cast it to date explicitly. + return _sqlExpressionFactory.Convert(upperBound, typeof(LocalDate), _typeMappingSource.FindMapping(typeof(LocalDate))); } if (member == DateInterval_Length) diff --git a/test/EFCore.PG.NodaTime.FunctionalTests/NodaTimeQueryNpgsqlTest.cs b/test/EFCore.PG.NodaTime.FunctionalTests/NodaTimeQueryNpgsqlTest.cs index 6886d312c..25f03a971 100644 --- a/test/EFCore.PG.NodaTime.FunctionalTests/NodaTimeQueryNpgsqlTest.cs +++ b/test/EFCore.PG.NodaTime.FunctionalTests/NodaTimeQueryNpgsqlTest.cs @@ -1300,7 +1300,7 @@ await AssertQuery( """ SELECT n."Id", n."DateInterval", n."Duration", n."Instant", n."InstantRange", n."Interval", n."LocalDate", n."LocalDate2", n."LocalDateRange", n."LocalDateTime", n."LocalTime", n."Long", n."OffsetTime", n."Period", n."TimeZoneId", n."ZonedDateTime" FROM "NodaTimeTypes" AS n -WHERE upper(n."DateInterval") - INTERVAL 'P1D' = DATE '2018-04-24' +WHERE CAST(upper(n."DateInterval") - INTERVAL 'P1D' AS date) = DATE '2018-04-24' """); }