Re: [HACKERS] Dates BC. - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: [HACKERS] Dates BC. |
Date | |
Msg-id | 200403292037.i2TKb7q13536@candle.pha.pa.us Whole thread Raw |
Responses |
Re: [HACKERS] Dates BC.
|
List | pgsql-patches |
Karel Zak wrote: > On Fri, Dec 19, 2003 at 01:12:08AM -0800, Dann Corbit wrote: > > There is no zero calendar year. The first year of Anno Domini is 1. It's ordinal, not cardinal. > > I agree. But the follow quoted code is not use in date_part() there > Kurt found bug. It's used in to_timestamp() _only_, and it works, > because tm2timestamp() and date2j() work with zero year. I have also add a doc mention to my patch that mentions that there is no 0 AD, and therefore subtraction of BC years from AD years must be done with caution. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: doc/src/sgml/func.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/func.sgml,v retrieving revision 1.195 diff -c -c -r1.195 func.sgml *** doc/src/sgml/func.sgml 19 Mar 2004 19:13:26 -0000 1.195 --- doc/src/sgml/func.sgml 29 Mar 2004 20:31:28 -0000 *************** *** 5216,5223 **** <term><literal>week</literal></term> <listitem> <para> ! The number of ! the week of the year that the day is in. By definition (<acronym>ISO</acronym> 8601), the first week of a year contains January 4 of that year. (The <acronym>ISO</acronym>-8601 week starts on Monday.) In other words, the first Thursday of --- 5216,5222 ---- <term><literal>week</literal></term> <listitem> <para> ! The number of the week of the year that the day is in. By definition (<acronym>ISO</acronym> 8601), the first week of a year contains January 4 of that year. (The <acronym>ISO</acronym>-8601 week starts on Monday.) In other words, the first Thursday of *************** *** 5235,5241 **** <term><literal>year</literal></term> <listitem> <para> ! The year field </para> <screen> --- 5234,5241 ---- <term><literal>year</literal></term> <listitem> <para> ! The year field. Keep in mind there is no <literal>0 AD</>, so subtracting ! <literal>BC</> years from <literal>AD</> years should be done with care. </para> <screen> Index: src/backend/utils/adt/datetime.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/utils/adt/datetime.c,v retrieving revision 1.125 diff -c -c -r1.125 datetime.c *** src/backend/utils/adt/datetime.c 25 Feb 2004 19:41:23 -0000 1.125 --- src/backend/utils/adt/datetime.c 29 Mar 2004 20:31:34 -0000 *************** *** 93,99 **** {"acsst", DTZ, POS(42)}, /* Cent. Australia */ {"acst", DTZ, NEG(16)}, /* Atlantic/Porto Acre Summer Time */ {"act", TZ, NEG(20)}, /* Atlantic/Porto Acre Time */ ! {DA_D, ADBC, AD}, /* "ad" for years >= 0 */ {"adt", DTZ, NEG(12)}, /* Atlantic Daylight Time */ {"aesst", DTZ, POS(44)}, /* E. Australia */ {"aest", TZ, POS(40)}, /* Australia Eastern Std Time */ --- 93,99 ---- {"acsst", DTZ, POS(42)}, /* Cent. Australia */ {"acst", DTZ, NEG(16)}, /* Atlantic/Porto Acre Summer Time */ {"act", TZ, NEG(20)}, /* Atlantic/Porto Acre Time */ ! {DA_D, ADBC, AD}, /* "ad" for years > 0 */ {"adt", DTZ, NEG(12)}, /* Atlantic Daylight Time */ {"aesst", DTZ, POS(44)}, /* E. Australia */ {"aest", TZ, POS(40)}, /* Australia Eastern Std Time */ *************** *** 139,145 **** {"azot", TZ, NEG(4)}, /* Azores Time */ {"azst", DTZ, POS(20)}, /* Azerbaijan Summer Time */ {"azt", TZ, POS(16)}, /* Azerbaijan Time */ ! {DB_C, ADBC, BC}, /* "bc" for years < 0 */ {"bdst", TZ, POS(8)}, /* British Double Summer Time */ {"bdt", TZ, POS(24)}, /* Dacca */ {"bnt", TZ, POS(32)}, /* Brunei Darussalam Time */ --- 139,145 ---- {"azot", TZ, NEG(4)}, /* Azores Time */ {"azst", DTZ, POS(20)}, /* Azerbaijan Summer Time */ {"azt", TZ, POS(16)}, /* Azerbaijan Time */ ! {DB_C, ADBC, BC}, /* "bc" for years <= 0 */ {"bdst", TZ, POS(8)}, /* British Double Summer Time */ {"bdt", TZ, POS(24)}, /* Dacca */ {"bnt", TZ, POS(32)}, /* Brunei Darussalam Time */ Index: src/backend/utils/adt/formatting.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/utils/adt/formatting.c,v retrieving revision 1.72 diff -c -c -r1.72 formatting.c *** src/backend/utils/adt/formatting.c 7 Jan 2004 18:56:28 -0000 1.72 --- src/backend/utils/adt/formatting.c 29 Mar 2004 20:31:40 -0000 *************** *** 169,175 **** * AC / DC * ---------- */ ! #define YEAR_ABS(_y) (_y < 0 ? -(_y -1) : _y) #define BC_STR_ORIG " BC" #define A_D_STR "A.D." --- 169,175 ---- * AC / DC * ---------- */ ! #define YEAR_ABS(_y) (_y <= 0 ? -(_y -1) : _y) #define BC_STR_ORIG " BC" #define A_D_STR "A.D." *************** *** 2119,2125 **** case DCH_B_C: if (flag == TO_CHAR) { ! strcpy(inout, (tm->tm_year < 0 ? B_C_STR : A_D_STR)); return 3; } --- 2119,2125 ---- case DCH_B_C: if (flag == TO_CHAR) { ! strcpy(inout, (tm->tm_year <= 0 ? B_C_STR : A_D_STR)); return 3; } *************** *** 2134,2140 **** case DCH_BC: if (flag == TO_CHAR) { ! strcpy(inout, (tm->tm_year < 0 ? BC_STR : AD_STR)); return 1; } --- 2134,2140 ---- case DCH_BC: if (flag == TO_CHAR) { ! strcpy(inout, (tm->tm_year <= 0 ? BC_STR : AD_STR)); return 1; } *************** *** 2149,2155 **** case DCH_b_c: if (flag == TO_CHAR) { ! strcpy(inout, (tm->tm_year < 0 ? b_c_STR : a_d_STR)); return 3; } --- 2149,2155 ---- case DCH_b_c: if (flag == TO_CHAR) { ! strcpy(inout, (tm->tm_year <= 0 ? b_c_STR : a_d_STR)); return 3; } *************** *** 2164,2170 **** case DCH_bc: if (flag == TO_CHAR) { ! strcpy(inout, (tm->tm_year < 0 ? bc_STR : ad_STR)); return 1; } --- 2164,2170 ---- case DCH_bc: if (flag == TO_CHAR) { ! strcpy(inout, (tm->tm_year <= 0 ? bc_STR : ad_STR)); return 1; } Index: src/backend/utils/adt/timestamp.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/utils/adt/timestamp.c,v retrieving revision 1.102 diff -c -c -r1.102 timestamp.c *** src/backend/utils/adt/timestamp.c 22 Mar 2004 01:38:17 -0000 1.102 --- src/backend/utils/adt/timestamp.c 29 Mar 2004 20:31:44 -0000 *************** *** 3261,3267 **** break; case DTK_YEAR: ! result = tm->tm_year; break; case DTK_DECADE: --- 3261,3271 ---- break; case DTK_YEAR: ! if (tm->tm_year > 0) ! result = tm->tm_year; ! else ! /* there is no year 0, just 1 BC and 1 AD*/ ! result = tm->tm_year - 1; break; case DTK_DECADE:
pgsql-patches by date: