@@ -40,9 +40,17 @@ public void ExtractYearMinValueTest()
4040 public void ExtractYearMaxValueTest ( )
4141 {
4242 Require . ProviderIs ( StorageProvider . PostgreSql ) ;
43+
4344 ExecuteInsideSession ( ( s ) => {
44- RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Year == DateTimeOffset . MaxValue . Year + 1 ) ;
45- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Year == DateTimeOffset . MaxValue . AddYears ( - 1 ) . Year ) ;
45+ var overflowHappens = localTimezone > TimeSpan . Zero ;
46+ if ( overflowHappens ) {
47+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Year == DateTimeOffset . MaxValue . Year + 1 ) ;
48+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Year == DateTimeOffset . MaxValue . AddYears ( - 1 ) . Year ) ;
49+ }
50+ else {
51+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Year == DateTimeOffset . MaxValue . Year ) ;
52+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Year == DateTimeOffset . MaxValue . AddYears ( - 1 ) . Year ) ;
53+ }
4654 } ) ;
4755 }
4856
@@ -74,9 +82,17 @@ public void ExtractMonthMinValueTest()
7482 public void ExtractMonthMaxValueTest ( )
7583 {
7684 Require . ProviderIs ( StorageProvider . PostgreSql ) ;
85+
7786 ExecuteInsideSession ( ( s ) => {
78- RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Month == DateTimeOffset . MaxValue . Month - 11 ) ;
79- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Month == DateTimeOffset . MaxValue . AddMonths ( - 1 ) . Month ) ;
87+ var overflowHappens = localTimezone > TimeSpan . Zero ;
88+ if ( overflowHappens ) {
89+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Month == 1 ) ;
90+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Month == DateTimeOffset . MaxValue . AddMonths ( - 1 ) . Month ) ;
91+ }
92+ else {
93+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Month == 12 ) ;
94+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Month == DateTimeOffset . MaxValue . AddMonths ( - 1 ) . Month ) ;
95+ }
8096 } ) ;
8197 }
8298
@@ -117,9 +133,17 @@ public void ExtractDayMaxValueTest()
117133 {
118134 Require . ProviderIs ( StorageProvider . PostgreSql ) ;
119135 ExecuteInsideSession ( ( s ) => {
120- // year overflow happens on server side because of timezone
121- RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Day == 1 ) ;
122- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Day == DateTimeOffset . MaxValue . AddDays ( - 1 ) . Day ) ;
136+ var overflowHappens = localTimezone > TimeSpan . Zero ;
137+ if ( overflowHappens ) {
138+ // year overflow happens on server side because of timezone
139+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Day == 1 ) ;
140+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Day == DateTimeOffset . MaxValue . AddDays ( - 1 ) . Day ) ;
141+ }
142+ else {
143+ // year overflow happens on server side because of timezone
144+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Day == 31 ) ;
145+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Day == DateTimeOffset . MaxValue . AddDays ( - 1 ) . Day ) ;
146+ }
123147 } ) ;
124148 }
125149
@@ -151,48 +175,12 @@ public void ExtractHourMinValueTest()
151175 Require . ProviderIs ( StorageProvider . PostgreSql ) ;
152176
153177 ExecuteInsideSession ( ( s ) => {
154- var service = s . Services . Get < Xtensive . Orm . Services . DirectSqlAccessor > ( ) ;
155-
156- var command = service . CreateCommand ( ) ;
157- command . CommandText = $ "SELECT COUNT(*) FROM public.\" MinMaxDateTimeOffsetEntity\" WHERE EXTRACT (HOUR FROM \" MinValue\" ) = 4";
158-
159- using ( command )
160- using ( var reader = command . ExecuteReader ( ) ) {
161-
162- while ( reader . Read ( ) ) {
163- var rowCount = reader . GetInt32 ( 0 ) ;
164- Console . WriteLine ( $ "Rows with HOUR 4 : { rowCount } ") ;
165- }
166- }
167-
168- command = service . CreateCommand ( ) ;
169- command . CommandText = $ "SELECT COUNT(*) FROM public.\" MinMaxDateTimeOffsetEntity\" WHERE EXTRACT (HOUR FROM \" MinValue\" ) = 5";
170-
171- using ( command )
172- using ( var reader = command . ExecuteReader ( ) ) {
173-
174- while ( reader . Read ( ) ) {
175- var rowCount = reader . GetInt32 ( 0 ) ;
176- Console . WriteLine ( $ "Rows with HOUR 5 : { rowCount } ") ;
177- }
178- }
179-
180- command = service . CreateCommand ( ) ;
181- command . CommandText = $ "SELECT (EXTRACT (TIMEZONE FROM \" MinValue\" ))::integer FROM public.\" MinMaxDateTimeOffsetEntity\" ";
182-
183- using ( command )
184- using ( var reader = command . ExecuteReader ( ) ) {
185-
186- while ( reader . Read ( ) ) {
187- var timezoneInSeconds = reader . GetDouble ( 0 ) ;
188- Console . WriteLine ( $ "Timezone : { TimeSpan . FromSeconds ( timezoneInSeconds ) } ") ;
189- }
190- }
191- } ) ;
192-
193-
194- ExecuteInsideSession ( ( s ) => {
195- RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MinValue . Hour == 5 ) ;
178+ var serverSideHours = ( localTimezone > TimeSpan . Zero )
179+ ? localTimezone . Hours - 1 // positive zone
180+ : ( localTimezone < TimeSpan . Zero )
181+ ? 23 + localTimezone . Hours // negative zone
182+ : 23 ; // UTC
183+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MinValue . Hour == serverSideHours ) ;
196184 RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MinValue . Hour == DateTimeOffset . MinValue . AddHours ( 1 ) . Hour ) ;
197185 } ) ;
198186 }
@@ -203,47 +191,12 @@ public void ExtractHourMaxValueTest()
203191 Require . ProviderIs ( StorageProvider . PostgreSql ) ;
204192
205193 ExecuteInsideSession ( ( s ) => {
206- var service = s . Services . Get < Xtensive . Orm . Services . DirectSqlAccessor > ( ) ;
207-
208- var command = service . CreateCommand ( ) ;
209- command . CommandText = $ "SELECT COUNT(*) FROM public.\" MinMaxDateTimeOffsetEntity\" WHERE EXTRACT (HOUR FROM \" MaxValue\" ) = 4";
210-
211- using ( command )
212- using ( var reader = command . ExecuteReader ( ) ) {
213-
214- while ( reader . Read ( ) ) {
215- var rowCount = reader . GetInt32 ( 0 ) ;
216- Console . WriteLine ( $ "Rows with HOUR 4 : { rowCount } ") ;
217- }
218- }
219-
220- command = service . CreateCommand ( ) ;
221- command . CommandText = $ "SELECT COUNT(*) FROM public.\" MinMaxDateTimeOffsetEntity\" WHERE EXTRACT (HOUR FROM \" MaxValue\" ) = 5";
222-
223- using ( command )
224- using ( var reader = command . ExecuteReader ( ) ) {
225-
226- while ( reader . Read ( ) ) {
227- var rowCount = reader . GetInt32 ( 0 ) ;
228- Console . WriteLine ( $ "Rows with HOUR 5 : { rowCount } ") ;
229- }
230- }
231-
232- command = service . CreateCommand ( ) ;
233- command . CommandText = $ "SELECT (EXTRACT (TIMEZONE FROM \" MaxValue\" ))::integer FROM public.\" MinMaxDateTimeOffsetEntity\" ";
234-
235- using ( command )
236- using ( var reader = command . ExecuteReader ( ) ) {
237-
238- while ( reader . Read ( ) ) {
239- var timezoneInSeconds = reader . GetDouble ( 0 ) ;
240- Console . WriteLine ( $ "Timezone : { TimeSpan . FromSeconds ( timezoneInSeconds ) } ") ;
241- }
242- }
243- } ) ;
244-
245- ExecuteInsideSession ( ( s ) => {
246- RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Hour == 4 ) ;
194+ var serverSideHours = ( localTimezone > TimeSpan . Zero )
195+ ? localTimezone . Hours - 1 // positive zone
196+ : ( localTimezone < TimeSpan . Zero )
197+ ? 23 + localTimezone . Hours // negative zone
198+ : 23 ; // UTC
199+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Hour == serverSideHours ) ;
247200 RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Hour == DateTimeOffset . MaxValue . AddHours ( - 1 ) . Hour ) ;
248201 } ) ;
249202 }
@@ -380,11 +333,19 @@ public void ExtractDateMinValueTest()
380333 public void ExtractDateMaxValueTest ( )
381334 {
382335 Require . ProviderIs ( StorageProvider . PostgreSql ) ;
383- ExecuteInsideSession ( ( s ) => {
384- // overflow of year from 9999-12-31 to 10000-01-01 because of how postgre works with timezones
385- // can't validate
386- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . DateTime ) ;
387- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Date == DateTimeOffset . MaxValue . AddDays ( - 1 ) . Date ) ;
336+
337+ ExecuteInsideSession ( ( s ) => {
338+ var overflowHappens = localTimezone > TimeSpan . Zero ;
339+ if ( overflowHappens ) {
340+ // overflow of year from 9999-12-31 to 10000-01-01 because of how postgre works with timezones
341+ // can't validate
342+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . DateTime ) ;
343+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Date == DateTimeOffset . MaxValue . AddDays ( - 1 ) . Date ) ;
344+ }
345+ else {
346+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . DateTime ) ;
347+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . Date == DateTimeOffset . MaxValue . AddDays ( - 2 ) . Date ) ;
348+ }
388349 } ) ;
389350 }
390351
@@ -511,8 +472,15 @@ public void ExtractDayOfYearMaxValueTest()
511472 {
512473 Require . ProviderIs ( StorageProvider . PostgreSql ) ;
513474 ExecuteInsideSession ( ( s ) => {
514- RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfYear == 1 ) ;
515- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfYear == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DayOfYear ) ;
475+ var overflowHappens = localTimezone > TimeSpan . Zero ;
476+ if ( overflowHappens ) {
477+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfYear == 1 ) ;
478+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfYear == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DayOfYear ) ;
479+ }
480+ else {
481+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfYear == DateTimeOffset . MaxValue . DayOfYear ) ;
482+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfYear == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DayOfYear ) ;
483+ }
516484 } ) ;
517485 }
518486
@@ -550,8 +518,15 @@ public void ExtractDayOfWeekMaxValueTest()
550518 {
551519 Require . ProviderIs ( StorageProvider . PostgreSql ) ;
552520 ExecuteInsideSession ( ( s ) => {
553- RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfWeek == DateTimeOffset . MaxValue . DayOfWeek + 1 ) ;
554- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfWeek == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DayOfWeek ) ;
521+ var overflowHappens = localTimezone > TimeSpan . Zero ;
522+ if ( overflowHappens ) {
523+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfWeek == DateTimeOffset . MaxValue . DayOfWeek + 1 ) ;
524+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfWeek == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DayOfWeek ) ;
525+ }
526+ else {
527+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfWeek == DateTimeOffset . MaxValue . DayOfWeek ) ;
528+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DayOfWeek == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DayOfWeek ) ;
529+ }
555530 } ) ;
556531 }
557532
@@ -592,8 +567,16 @@ public void ExtractDateTimeMaxValueTest()
592567 ExecuteInsideSession ( ( s ) => {
593568 // overflow of year from 9999-12-31 to 10000-01-01 because of how postgre works with timezones
594569 // can't validate
595- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . DateTime ) ;
596- RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DateTime ) ;
570+ var overflowHappens = localTimezone > TimeSpan . Zero ;
571+ if ( overflowHappens ) {
572+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . DateTime ) ;
573+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DateTime ) ;
574+ }
575+ else {
576+ RunTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . DateTime ) ;
577+ RunWrongTest < MinMaxDateTimeOffsetEntity > ( s , c => c . MaxValue . DateTime == DateTimeOffset . MaxValue . AddDays ( - 1 ) . DateTime ) ;
578+ }
579+
597580 } ) ;
598581 }
599582
0 commit comments