@@ -2426,27 +2426,30 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2426
2426
* display time as shown on a 12-hour clock, even for
2427
2427
* intervals
2428
2428
*/
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 ,
2430
2430
tm -> tm_hour % (HOURS_PER_DAY / 2 ) == 0 ? HOURS_PER_DAY / 2 :
2431
2431
tm -> tm_hour % (HOURS_PER_DAY / 2 ));
2432
2432
if (S_THth (n -> suffix ))
2433
2433
str_numth (s , s , S_TH_TYPE (n -> suffix ));
2434
2434
s += strlen (s );
2435
2435
break ;
2436
2436
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 );
2438
2439
if (S_THth (n -> suffix ))
2439
2440
str_numth (s , s , S_TH_TYPE (n -> suffix ));
2440
2441
s += strlen (s );
2441
2442
break ;
2442
2443
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 );
2444
2446
if (S_THth (n -> suffix ))
2445
2447
str_numth (s , s , S_TH_TYPE (n -> suffix ));
2446
2448
s += strlen (s );
2447
2449
break ;
2448
2450
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 );
2450
2453
if (S_THth (n -> suffix ))
2451
2454
str_numth (s , s , S_TH_TYPE (n -> suffix ));
2452
2455
s += strlen (s );
@@ -2503,7 +2506,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2503
2506
break ;
2504
2507
case DCH_OF :
2505
2508
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 );
2507
2511
s += strlen (s );
2508
2512
if ((int ) tm -> tm_gmtoff % SECS_PER_HOUR != 0 )
2509
2513
{
@@ -2653,7 +2657,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2653
2657
s += strlen (s );
2654
2658
break ;
2655
2659
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 );
2657
2662
if (S_THth (n -> suffix ))
2658
2663
str_numth (s , s , S_TH_TYPE (n -> suffix ));
2659
2664
s += strlen (s );
@@ -2828,7 +2833,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2828
2833
i = tm -> tm_year / 100 - 1 ;
2829
2834
}
2830
2835
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 );
2832
2837
else
2833
2838
sprintf (s , "%d" , i );
2834
2839
if (S_THth (n -> suffix ))
@@ -2846,7 +2851,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2846
2851
case DCH_YYYY :
2847
2852
case DCH_IYYY :
2848
2853
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 ,
2850
2856
(n -> key -> id == DCH_YYYY ?
2851
2857
ADJUST_YEAR (tm -> tm_year , is_interval ) :
2852
2858
ADJUST_YEAR (date2isoyear (tm -> tm_year ,
@@ -2860,7 +2866,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2860
2866
case DCH_YYY :
2861
2867
case DCH_IYY :
2862
2868
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 ,
2864
2871
(n -> key -> id == DCH_YYY ?
2865
2872
ADJUST_YEAR (tm -> tm_year , is_interval ) :
2866
2873
ADJUST_YEAR (date2isoyear (tm -> tm_year ,
@@ -2874,7 +2881,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2874
2881
case DCH_YY :
2875
2882
case DCH_IY :
2876
2883
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 ,
2878
2886
(n -> key -> id == DCH_YY ?
2879
2887
ADJUST_YEAR (tm -> tm_year , is_interval ) :
2880
2888
ADJUST_YEAR (date2isoyear (tm -> tm_year ,
0 commit comments