s += strlen(s);
                break;
            case DCH_RM:
-               if (!tm->tm_mon)
-                   break;
-               sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -4,
-                       rm_months_upper[MONTHS_PER_YEAR - tm->tm_mon]);
-               s += strlen(s);
-               break;
+               /* FALLTHROUGH */
            case DCH_rm:
-               if (!tm->tm_mon)
+
+               /*
+                * For intervals, values like '12 month' will be reduced to 0
+                * month and some years.  These should be processed.
+                */
+               if (!tm->tm_mon && !tm->tm_year)
                    break;
-               sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -4,
-                       rm_months_lower[MONTHS_PER_YEAR - tm->tm_mon]);
-               s += strlen(s);
+               else
+               {
+                   int         mon = 0;
+                   const char *const *months;
+
+                   if (n->key->id == DCH_RM)
+                       months = rm_months_upper;
+                   else
+                       months = rm_months_lower;
+
+                   /*
+                    * Compute the position in the roman-numeral array.  Note
+                    * that the contents of the array are reversed, December
+                    * being first and January last.
+                    */
+                   if (tm->tm_mon == 0)
+                   {
+                       /*
+                        * This case is special, and tracks the case of full
+                        * interval years.
+                        */
+                       mon = tm->tm_year >= 0 ? 0 : MONTHS_PER_YEAR - 1;
+                   }
+                   else if (tm->tm_mon < 0)
+                   {
+                       /*
+                        * Negative case.  In this case, the calculation is
+                        * reversed, where -1 means December, -2 November,
+                        * etc.
+                        */
+                       mon = -1 * (tm->tm_mon + 1);
+                   }
+                   else
+                   {
+                       /*
+                        * Common case, with a strictly positive value.  The
+                        * position in the array matches with the value of
+                        * tm_mon.
+                        */
+                       mon = MONTHS_PER_YEAR - tm->tm_mon;
+                   }
+
+                   sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -4,
+                           months[mon]);
+                   s += strlen(s);
+               }
                break;
            case DCH_W:
                sprintf(s, "%d", (tm->tm_mday - 1) / 7 + 1);
 
             | 2001 1 1 1 1 1 1
 (65 rows)
 
+-- Roman months, with upper and lower case.
+SELECT i,
+       to_char(i * interval '1mon', 'rm'),
+       to_char(i * interval '1mon', 'RM')
+    FROM generate_series(-13, 13) i;
+  i  | to_char | to_char 
+-----+---------+---------
+ -13 | xii     | XII 
+ -12 | i       | I   
+ -11 | ii      | II  
+ -10 | iii     | III 
+  -9 | iv      | IV  
+  -8 | v       | V   
+  -7 | vi      | VI  
+  -6 | vii     | VII 
+  -5 | viii    | VIII
+  -4 | ix      | IX  
+  -3 | x       | X   
+  -2 | xi      | XI  
+  -1 | xii     | XII 
+   0 |         | 
+   1 | i       | I   
+   2 | ii      | II  
+   3 | iii     | III 
+   4 | iv      | IV  
+   5 | v       | V   
+   6 | vi      | VI  
+   7 | vii     | VII 
+   8 | viii    | VIII
+   9 | ix      | IX  
+  10 | x       | X   
+  11 | xi      | XI  
+  12 | xii     | XII 
+  13 | i       | I   
+(27 rows)
+
 -- timestamp numeric fields constructor
 SELECT make_timestamp(2014,12,28,6,30,45.887);
         make_timestamp        
 
 SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
    FROM TIMESTAMP_TBL;
 
+-- Roman months, with upper and lower case.
+SELECT i,
+       to_char(i * interval '1mon', 'rm'),
+       to_char(i * interval '1mon', 'RM')
+    FROM generate_series(-13, 13) i;
+
 -- timestamp numeric fields constructor
 SELECT make_timestamp(2014,12,28,6,30,45.887);