*** ./doc/src/sgml/func.sgml.orig	Wed Mar 31 08:58:31 2004
--- ./doc/src/sgml/func.sgml	Sun Apr  4 10:23:00 2004
***************
*** 4948,4965 ****
        century
        
         
!         The year field divided by 100
         
  
  
! SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
  Result: 20
  
  
         
!         Note that the result for the century field is simply the year field
!         divided by 100, and not the conventional definition which puts most
!         years in the 1900's in the twentieth century.
         
        
       
--- 4948,4978 ----
        century
        
         
!         The historical definition of a century.
         
  
  
! SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
  Result: 20
+ SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
+ Result: 21
  
  
         
!         An historical century is a period of 100 years.
! 	The first century starts at 0001-01-01 00:00:00 AD, although
! 	they did not know at the time. This definition applies to all
! 	Gregorian calendar countries. There is no number 0 century, 
! 	you go from -1 to 1.
! 
! 	If you disagree with this, please write your complaint to:
! 	Pope, Cathedral Saint-Peter of Roma, Vatican.
!        
! 
!        
! 	Compatibility: if you want the previous postgres version of century,
! 	just divide the year by 100. Note that with this definition, 
! 	century number 0 lasts 200 years.
         
        
       
***************
*** 5083,5100 ****
        millennium
        
         
!         The year field divided by 1000
         
  
  
  SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
! Result: 2
  
  
         
!         Note that the result for the millennium field is simply the year field
!         divided by 1000, and not the conventional definition which puts
!         years in the 1900's in the second millennium.
         
        
       
--- 5096,5112 ----
        millennium
        
         
!         The conventional historical millennium.
         
  
  
  SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
! Result: 3
  
  
         
!         Years in the 1900's are in the second millennium.
! 	The third millennium starts January 1, 2001.
         
        
       
*** ./src/backend/utils/adt/timestamp.c.orig	Wed Mar 31 08:58:40 2004
--- ./src/backend/utils/adt/timestamp.c	Sun Apr  4 10:45:59 2004
***************
*** 3273,3283 ****
  				break;
  
  			case DTK_CENTURY:
! 				result = (tm->tm_year / 100);
  				break;
  
  			case DTK_MILLENNIUM:
! 				result = (tm->tm_year / 1000);
  				break;
  
  			case DTK_JULIAN:
--- 3273,3295 ----
  				break;
  
  			case DTK_CENTURY:
! 				/* centuries AD, c>0: year in [ (c-1)*100+1 :     c*100   ]
! 				 * centuries BC, c<0: year in [     c*100   : (c+1)*100-1 ]
! 				 * there is no number 0 century.
! 				 */
! 				if (tm->tm_year > 0)
! 					result = ((tm->tm_year+99) / 100);
! 				else
! 					/* caution: C division may yave negative remainder */
! 					result = - ((99 - (tm->tm_year-1))/100);
  				break;
  
  			case DTK_MILLENNIUM:
! 				/* see comments above. */
! 				if (tm->tm_year > 0)
! 					result = ((tm->tm_year+999) / 1000);
! 				else
! 					result = - ((999 - (tm->tm_year-1))/1000);
  				break;
  
  			case DTK_JULIAN:
*** ./src/test/regress/expected/date.out.orig	Sun Apr  4 10:42:21 2004
--- ./src/test/regress/expected/date.out	Sun Apr  4 10:52:23 2004
***************
*** 819,821 ****
--- 819,932 ----
          2
  (1 row)
  
+ --
+ -- test extract!
+ --
+ -- century
+ --
+ SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2
+  date_part 
+ -----------
+         -2
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1
+  date_part 
+ -----------
+         -1
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1
+  date_part 
+ -----------
+         -1
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM DATE '0001-01-01');    --  1
+  date_part 
+ -----------
+          1
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); --  1
+  date_part 
+ -----------
+          1
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM DATE '1900-12-31');    -- 19
+  date_part 
+ -----------
+         19
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM DATE '1901-01-01');    -- 20
+  date_part 
+ -----------
+         20
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM DATE '2000-12-31');    -- 20
+  date_part 
+ -----------
+         20
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM DATE '2001-01-01');    -- 21
+  date_part 
+ -----------
+         21
+ (1 row)
+ 
+ SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True;     -- true
+  true 
+ ------
+  t
+ (1 row)
+ 
+ --
+ -- millennium
+ --
+ SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1
+  date_part 
+ -----------
+         -1
+ (1 row)
+ 
+ SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); --  1
+  date_part 
+ -----------
+          1
+ (1 row)
+ 
+ SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31');    --  1
+  date_part 
+ -----------
+          1
+ (1 row)
+ 
+ SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01');    --  2
+  date_part 
+ -----------
+          2
+ (1 row)
+ 
+ SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31');    --  2
+  date_part 
+ -----------
+          2
+ (1 row)
+ 
+ SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01');    --  3
+  date_part 
+ -----------
+          3
+ (1 row)
+ 
+ -- next test to be fixed on the turn of the next millennium;-)
+ SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE);         --  3
+  date_part 
+ -----------
+          3
+ (1 row)
+ 
*** ./src/test/regress/sql/date.sql.orig	Sun Nov 16 21:29:16 2003
--- ./src/test/regress/sql/date.sql	Sun Apr  4 10:51:43 2004
***************
*** 208,210 ****
--- 208,237 ----
  SELECT date 'today' - date 'yesterday' AS "One day";
  
  SELECT date 'tomorrow' - date 'yesterday' AS "Two days";
+ 
+ --
+ -- test extract!
+ --
+ -- century
+ --
+ SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2
+ SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1
+ SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1
+ SELECT EXTRACT(CENTURY FROM DATE '0001-01-01');    --  1
+ SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); --  1
+ SELECT EXTRACT(CENTURY FROM DATE '1900-12-31');    -- 19
+ SELECT EXTRACT(CENTURY FROM DATE '1901-01-01');    -- 20
+ SELECT EXTRACT(CENTURY FROM DATE '2000-12-31');    -- 20
+ SELECT EXTRACT(CENTURY FROM DATE '2001-01-01');    -- 21
+ SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True;     -- true
+ --
+ -- millennium
+ --
+ SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1
+ SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); --  1
+ SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31');    --  1
+ SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01');    --  2
+ SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31');    --  2
+ SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01');    --  3
+ -- next test to be fixed on the turn of the next millennium;-)
+ SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE);         --  3