@@ -18,6 +18,9 @@ namespace Xtensive.Sql.Drivers.PostgreSql.v8_0
1818{
1919 internal class TypeMapper : Sql . TypeMapper
2020 {
21+ // 6 fractions instead of .NET's 7
22+ private const long DateTimeMaxValueAdjustedTicks = 3155378975999999990 ;
23+
2124 protected readonly bool legacyTimestampBehaviorEnabled ;
2225
2326 public override bool IsParameterCastRequired ( Type type )
@@ -236,11 +239,34 @@ public override object ReadDecimal(DbDataReader reader, int index)
236239 return nativeReader . GetDecimal ( index ) ;
237240 }
238241
242+ public override object ReadDateTime ( DbDataReader reader , int index )
243+ {
244+ var value = reader . GetDateTime ( index ) ;
245+ if ( value . Ticks == 0 )
246+ return DateTime . MinValue ;
247+ if ( value . Ticks == DateTimeMaxValueAdjustedTicks ) {
248+ // To not ruin possible comparisons with defined value,
249+ // it is better to return definded value,
250+ // not the 6-digit version from PostgreSQL
251+ return DateTime . MaxValue ;
252+ }
253+ return value ;
254+ }
255+
239256 [ SecuritySafeCritical ]
240257 public override object ReadDateTimeOffset ( DbDataReader reader , int index )
241258 {
242259 var nativeReader = ( NpgsqlDataReader ) reader ;
243260 var value = nativeReader . GetFieldValue < DateTimeOffset > ( index ) ;
261+ if ( value . Ticks == DateTimeMaxValueAdjustedTicks ) {
262+ // To not ruin possible comparisons with defined values,
263+ // it is better to return definded value,
264+ // not the 6-fractions version from PostgreSQL
265+ return DateTimeOffset . MaxValue ;
266+ }
267+ if ( value . Ticks == 0 )
268+ return DateTimeOffset . MinValue ;
269+
244270 if ( legacyTimestampBehaviorEnabled ) {
245271 // Npgsql 4 or older behavior
246272 return value ;
@@ -256,8 +282,6 @@ public override object ReadDateTimeOffset(DbDataReader reader, int index)
256282 // 'SET TIME ZONE' statement :-)
257283 //
258284 // We'll use local time, that's it! SET TIME ZONE will not work!
259- if ( value == DateTimeOffset . MinValue || value == DateTimeOffset . MaxValue )
260- return value ;
261285 return value . ToLocalTime ( ) ;
262286 }
263287 }
0 commit comments