@@ -2426,27 +2426,30 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
24262426 * display time as shown on a 12-hour clock, even for
24272427 * intervals
24282428 */
2429- sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : 2 ,
2429+ sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : ( tm -> tm_hour >= 0 ) ? 2 : 3 ,
24302430 tm -> tm_hour % (HOURS_PER_DAY / 2 ) == 0 ? HOURS_PER_DAY / 2 :
24312431 tm -> tm_hour % (HOURS_PER_DAY / 2 ));
24322432 if (S_THth (n -> suffix ))
24332433 str_numth (s , s , S_TH_TYPE (n -> suffix ));
24342434 s += strlen (s );
24352435 break ;
24362436 case DCH_HH24 :
2437- sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : 2 , tm -> tm_hour );
2437+ sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : (tm -> tm_hour >= 0 ) ? 2 : 3 ,
2438+ tm -> tm_hour );
24382439 if (S_THth (n -> suffix ))
24392440 str_numth (s , s , S_TH_TYPE (n -> suffix ));
24402441 s += strlen (s );
24412442 break ;
24422443 case DCH_MI :
2443- sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : 2 , tm -> tm_min );
2444+ sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : (tm -> tm_min >= 0 ) ? 2 : 3 ,
2445+ tm -> tm_min );
24442446 if (S_THth (n -> suffix ))
24452447 str_numth (s , s , S_TH_TYPE (n -> suffix ));
24462448 s += strlen (s );
24472449 break ;
24482450 case DCH_SS :
2449- sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : 2 , tm -> tm_sec );
2451+ sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : (tm -> tm_sec >= 0 ) ? 2 : 3 ,
2452+ tm -> tm_sec );
24502453 if (S_THth (n -> suffix ))
24512454 str_numth (s , s , S_TH_TYPE (n -> suffix ));
24522455 s += strlen (s );
@@ -2503,7 +2506,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25032506 break ;
25042507 case DCH_OF :
25052508 INVALID_FOR_INTERVAL ;
2506- sprintf (s , "%+0*d" , S_FM (n -> suffix ) ? 0 : 3 , (int ) tm -> tm_gmtoff / SECS_PER_HOUR );
2509+ sprintf (s , "%+0*d" , S_FM (n -> suffix ) ? 0 : (tm -> tm_gmtoff >= 0 ) ? 3 : 4 ,
2510+ (int ) tm -> tm_gmtoff / SECS_PER_HOUR );
25072511 s += strlen (s );
25082512 if ((int ) tm -> tm_gmtoff % SECS_PER_HOUR != 0 )
25092513 {
@@ -2653,7 +2657,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
26532657 s += strlen (s );
26542658 break ;
26552659 case DCH_MM :
2656- sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : 2 , tm -> tm_mon );
2660+ sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : (tm -> tm_mon >= 0 ) ? 2 : 3 ,
2661+ tm -> tm_mon );
26572662 if (S_THth (n -> suffix ))
26582663 str_numth (s , s , S_TH_TYPE (n -> suffix ));
26592664 s += strlen (s );
@@ -2828,7 +2833,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
28282833 i = tm -> tm_year / 100 - 1 ;
28292834 }
28302835 if (i <= 99 && i >= -99 )
2831- sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : 2 , i );
2836+ sprintf (s , "%0*d" , S_FM (n -> suffix ) ? 0 : ( i >= 0 ) ? 2 : 3 , i );
28322837 else
28332838 sprintf (s , "%d" , i );
28342839 if (S_THth (n -> suffix ))
@@ -2846,7 +2851,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
28462851 case DCH_YYYY :
28472852 case DCH_IYYY :
28482853 sprintf (s , "%0*d" ,
2849- S_FM (n -> suffix ) ? 0 : 4 ,
2854+ S_FM (n -> suffix ) ? 0 :
2855+ (ADJUST_YEAR (tm -> tm_year , is_interval ) >= 0 ) ? 4 : 5 ,
28502856 (n -> key -> id == DCH_YYYY ?
28512857 ADJUST_YEAR (tm -> tm_year , is_interval ) :
28522858 ADJUST_YEAR (date2isoyear (tm -> tm_year ,
@@ -2860,7 +2866,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
28602866 case DCH_YYY :
28612867 case DCH_IYY :
28622868 sprintf (s , "%0*d" ,
2863- S_FM (n -> suffix ) ? 0 : 3 ,
2869+ S_FM (n -> suffix ) ? 0 :
2870+ (ADJUST_YEAR (tm -> tm_year , is_interval ) >= 0 ) ? 3 : 4 ,
28642871 (n -> key -> id == DCH_YYY ?
28652872 ADJUST_YEAR (tm -> tm_year , is_interval ) :
28662873 ADJUST_YEAR (date2isoyear (tm -> tm_year ,
@@ -2874,7 +2881,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
28742881 case DCH_YY :
28752882 case DCH_IY :
28762883 sprintf (s , "%0*d" ,
2877- S_FM (n -> suffix ) ? 0 : 2 ,
2884+ S_FM (n -> suffix ) ? 0 :
2885+ (ADJUST_YEAR (tm -> tm_year , is_interval ) >= 0 ) ? 2 : 3 ,
28782886 (n -> key -> id == DCH_YY ?
28792887 ADJUST_YEAR (tm -> tm_year , is_interval ) :
28802888 ADJUST_YEAR (date2isoyear (tm -> tm_year ,
0 commit comments