*** ./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