diff options
Diffstat (limited to 'doc/src/sgml/datetime.sgml')
-rw-r--r-- | doc/src/sgml/datetime.sgml | 834 |
1 files changed, 697 insertions, 137 deletions
diff --git a/doc/src/sgml/datetime.sgml b/doc/src/sgml/datetime.sgml index eba6dbb583f..3c381c1212e 100644 --- a/doc/src/sgml/datetime.sgml +++ b/doc/src/sgml/datetime.sgml @@ -1,155 +1,715 @@ -From - Mon May 10 15:59:27 1999 -Received: from localhost (lockhart@localhost [127.0.0.1]) - by localhost (8.8.7/8.8.7) with ESMTP id PAA24871 - for <lockhart@localhost>; Wed, 14 Apr 1999 15:45:24 GMT -Received: from apop-server.alumni.caltech.edu - by localhost with POP3 (fetchmail-4.7.9) - for lockhart@localhost (single-drop); Wed, 14 Apr 1999 15:45:26 +0000 (UTC) -Received: from bologna.nettuno.it (bologna.nettuno.it [193.43.2.1]) - by alumnus.caltech.edu (8.9.1/8.9.1) with ESMTP id IAA18386 - for <lockhart@alumni.caltech.edu>; Wed, 14 Apr 1999 08:41:45 -0700 (PDT) -Received: from proxy.sferacarta.com (mail@sfcabop1.nettuno.it [193.207.10.213]) - by bologna.nettuno.it (8.8.6/8.8.6/NETTuno 3.1) with ESMTP id RAA15888; - Wed, 14 Apr 1999 17:41:33 +0200 (MDT) -Received: from rosso.sferacarta.com (sferacarta.com) [10.20.30.5] - by proxy.sferacarta.com with esmtp (Exim 2.05 #1 (Debian)) - id 10XTfQ-00083Z-00; Wed, 14 Apr 1999 17:41:40 +0000 -Message-ID: <3714B6B6.F745D41D@sferacarta.com> -Date: Wed, 14 Apr 1999 17:39:34 +0200 -From: José Soares <jose@sferacarta.com> -X-Mailer: Mozilla 4.5 [it] (Win95; I) -X-Accept-Language: it -MIME-Version: 1.0 -To: Thomas Lockhart <lockhart@alumni.caltech.edu> -CC: hackers <pgsql-hackers@postgresql.org>, - general <pgsql-general@postgresql.org> -Subject: Re: [GENERAL] Re: [HACKERS] Gregorian Calendar -References: <3711B1E5.80213DF6@sferacarta.com> <37135951.88FDB948@alumni.caltech.edu> -Content-Transfer-Encoding: 8bit -Content-Type: text/plain; charset=iso-8859-1 -X-UIDL: 25f0580d2a532247ac6af3aee9737b7c -X-Mozilla-Status: 8011 -X-Mozilla-Status2: 00000000 - -Hi Thomas, - -Thomas Lockhart ha scritto: - -> > I have a question about dates. -> > The Gregorian reform of calendar skiped 10 days on Oct, 1582. -> > This reform was accepted by Great Britain and Dominions (including -> > what is now the USA) only in 1752. -> > If I insert a date that doesn't exist PostgreSQL accepts it. -> > Should it be considered normal ? -> -> As Peter says, this is tricky. -> -> Date conventions before the 19th century make for interesting reading, -> but are not imho consistant enough to warrant coding into a date/time -> handler. -> -> As you probably have noticed, we use Julian date calculations for our -> date/time support. - -I suppose you refer to Julian Day invented by the French scholar -Joseph Justus Scaliger (1540-1609) -that probably takes its name from the Scaliger's father, -the Italian scholar Julius Caesar Scaliger (1484-1558). -Astronomers have used the Julian period to assign a unique number to -every day since 1 January 4713 BC. This is the so-called Julian Day -(JD). JD 0 designates the 24 hours from noon UTC on 1 January 4713 BC -to noon UTC on 2 January 4713 BC. - -Julian Day is different from Julian Date - -The Julian calendar was introduced by Julius Caesar in 45 BC. It was -in common use until the 1582, when countries started changing to the -Gregorian calendar. - -In the Julian calendar, the tropical year is approximated as 365 1/4 -days = 365.25 days. This gives an error of 1 day in approximately 128 - -and this is why pope Gregory XIII in accordance with instructions -from the Council of Trent reformed the calendar to correct this error. - -In the Gregorian calendar, the tropical year is approximated as -365 + 97 / 400 days = 365.2425 days. Thus it takes approximately 3300 -years for the tropical year to shift one day with respect to the -Gregorian calendar. - -The approximation 365+97/400 is achieved by having 97 leap years -every 400 years. - -The Gregorian calendar has 97 leap years every 400 years: +<!-- +$Header: /cvsroot/pgsql/doc/src/sgml/datetime.sgml,v 2.2 1999/05/22 02:27:23 thomas Exp $ +Date/time details - Every year divisible by 4 is a leap year. - However, every year divisible by 100 is not a leap year. - However, every year divisible by 400 is a leap year after all. +$Log: datetime.sgml,v $ +Revision 2.2 1999/05/22 02:27:23 thomas +Finish initial markup of cvs.sgml, and include it in the programmer's guide + and the integrated doc. Clean up other markup. -So, 1700, 1800, 1900, 2100, and 2200 are not leap years. But 1600, -2000, and 2400 are leap years. +--> -instead in the Julian calendar only years divisible by 4 are leap years. +<appendix label="UG1" id="datetime-append"> + <title>Date/Time Support</title> -The papal bull of February 1582 decreed that 10 days should be dropped -from October 1582 so that 15 October should follow immediately after -4 October. -This was observed in Italy, Poland, Portugal, and Spain. Other Catholic -countries followed shortly after, but Protestant countries were -reluctant to change, and the Greek orthodox countries didn't change -until the start of this century. + <sect1> + <title>Time Zones</title> -The reform was observed by Great Britain and Dominions (including what is -now the USA) -in 1752. -The 2 Sep 1752 was followed by 14 Sep 1752. + <para> + <table tocentry="1"> + <title><productname>Postgres</productname> Recognized Time Zones</title> + <titleabbrev>Time Zones</titleabbrev> + <tgroup cols="3"> + <thead> + <row> + <entry>Time Zone</entry> + <entry>Offset from UTC</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry>NZDT</entry> + <entry>+13:00</entry> + <entry>New Zealand Daylight Time</entry> + </row> + <row> + <entry>IDLE</entry> + <entry>+12:00</entry> + <entry>International Date Line, East</entry> + </row> + <row> + <entry>NZST</entry> + <entry>+12:00</entry> + <entry>New Zealand Std Time</entry> + </row> + <row> + <entry>NZT</entry> + <entry>+12:00</entry> + <entry>New Zealand Time</entry> + </row> + <row> + <entry>AESST</entry> + <entry>+11:00 </entry> + <entry>Australia Eastern Summer Std Time</entry> + </row> + <row> + <entry>ACSST</entry> + <entry>+10:30 </entry> + <entry>Central Australia Summer Std Time</entry> + </row> + <row> + <entry>CADT</entry> + <entry>+10:30 </entry> + <entry>Central Australia Daylight Savings Time</entry> + </row> + <row> + <entry>SADT</entry> + <entry>+10:30</entry> + <entry>South Australian Daylight Time</entry> + </row> + <row> + <entry>AEST</entry> + <entry>+10:00 </entry> + <entry>Australia Eastern Std Time</entry> + </row> + <row> + <entry>EAST</entry> + <entry>+10:00 </entry> + <entry>East Australian Std Time</entry> + </row> + <row> + <entry>GST</entry> + <entry>+10:00</entry> + <entry>Guam Std Time, USSR Zone 9</entry> + </row> + <row> + <entry>LIGT</entry> + <entry>+10:00</entry> + <entry>Melbourne, Australia</entry> + </row> + <row> + <entry>ACST</entry> + <entry>+09:30 </entry> + <entry>Central Australia Std Time</entry> + </row> + <row> + <entry>CAST</entry> + <entry>+09:30 </entry> + <entry>Central Australia Std Time</entry> + </row> + <row> + <entry>SAT</entry> + <entry>+9:30</entry> + <entry>South Australian Std Time</entry> + </row> + <row> + <entry>AWSST</entry> + <entry>+9:00 </entry> + <entry>Australia Western Summer Std Time</entry> + </row> + <row> + <entry>JST</entry> + <entry>+9:00</entry> + <entry>Japan Std Time,USSR Zone 8</entry> + </row> + <row> + <entry>KST</entry> + <entry>+9:00</entry> + <entry>Korea Standard Time</entry> + </row> + <row> + <entry>WDT</entry> + <entry>+9:00</entry> + <entry>West Australian Daylight Time</entry> + </row> + <row> + <entry>MT</entry> + <entry>+8:30</entry> + <entry>Moluccas Time</entry> + </row> + <row> + <entry>AWST</entry> + <entry>+8:00 </entry> + <entry>Australia Western Std Time</entry> + </row> + <row> + <entry>CCT</entry> + <entry>+8:00 </entry> + <entry>China Coastal Time</entry> + </row> + <row> + <entry>WADT</entry> + <entry>+8:00</entry> + <entry>West Australian Daylight Time</entry> + </row> + <row> + <entry>WST</entry> + <entry>+8:00</entry> + <entry>West Australian Std Time</entry> + </row> + <row> + <entry>JT</entry> + <entry>+7:30</entry> + <entry>Java Time</entry> + </row> + <row> + <entry>WAST</entry> + <entry>+7:00</entry> + <entry>West Australian Std Time</entry> + </row> + <row> + <entry>IT</entry> + <entry>+3:30</entry> + <entry>Iran Time</entry> + </row> + <row> + <entry>BT</entry> + <entry>+3:00 </entry> + <entry>Baghdad Time</entry> + </row> + <row> + <entry>EETDST</entry> + <entry>+3:00 </entry> + <entry>Eastern Europe Daylight Savings Time</entry> + </row> + <row> + <entry>CETDST</entry> + <entry>+2:00 </entry> + <entry>Central European Daylight Savings Time</entry> + </row> + <row> + <entry>EET</entry> + <entry>+2:00 </entry> + <entry>Eastern Europe, USSR Zone 1</entry> + </row> + <row> + <entry>FWT</entry> + <entry>+2:00</entry> + <entry>French Winter Time</entry> + </row> + <row> + <entry>IST</entry> + <entry>+2:00</entry> + <entry>Israel Std Time</entry> + </row> + <row> + <entry>MEST</entry> + <entry>+2:00</entry> + <entry>Middle Europe Summer Time</entry> + </row> + <row> + <entry>METDST</entry> + <entry>+2:00</entry> + <entry>Middle Europe Daylight Time</entry> + </row> + <row> + <entry>SST</entry> + <entry>+2:00</entry> + <entry>Swedish Summer Time</entry> + </row> + <row> + <entry>BST</entry> + <entry>+1:00 </entry> + <entry>British Summer Time</entry> + </row> + <row> + <entry>CET</entry> + <entry>+1:00 </entry> + <entry>Central European Time</entry> + </row> + <row> + <entry>DNT</entry> + <entry>+1:00 </entry> + <entry>Dansk Normal Tid</entry> + </row> + <row> + <entry>DST</entry> + <entry>+1:00 </entry> + <entry>Dansk Standard Time (?)</entry> + </row> + <row> + <entry>FST</entry> + <entry>+1:00 </entry> + <entry>French Summer Time</entry> + </row> + <row> + <entry>MET</entry> + <entry>+1:00</entry> + <entry>Middle Europe Time</entry> + </row> + <row> + <entry>MEWT</entry> + <entry>+1:00</entry> + <entry>Middle Europe Winter Time</entry> + </row> + <row> + <entry>MEZ</entry> + <entry>+1:00</entry> + <entry>Middle Europe Zone</entry> + </row> + <row> + <entry>NOR</entry> + <entry>+1:00</entry> + <entry>Norway Standard Time</entry> + </row> + <row> + <entry>SET</entry> + <entry>+1:00</entry> + <entry>Seychelles Time</entry> + </row> + <row> + <entry>SWT</entry> + <entry>+1:00</entry> + <entry>Swedish Winter Time</entry> + </row> + <row> + <entry>WETDST</entry> + <entry>+1:00</entry> + <entry>Western Europe Daylight Savings Time</entry> + </row> + <row> + <entry>GMT</entry> + <entry>0:00</entry> + <entry>Greenwish Mean Time</entry> + </row> + <row> + <entry>WET</entry> + <entry>0:00</entry> + <entry>Western Europe</entry> + </row> + <row> + <entry>WAT</entry> + <entry>-1:00</entry> + <entry>West Africa Time</entry> + </row> + <row> + <entry>NDT</entry> + <entry>-2:30</entry> + <entry>Newfoundland Daylight Time</entry> + </row> + <row> + <entry>ADT</entry> + <entry>-03:00 </entry> + <entry>Atlantic Daylight Time</entry> + </row> + <row> + <entry>NFT</entry> + <entry>-3:30</entry> + <entry>Newfoundland Standard Time</entry> + </row> + <row> + <entry>NST</entry> + <entry>-3:30</entry> + <entry>Newfoundland Standard Time</entry> + </row> + <row> + <entry>AST</entry> + <entry>-4:00 </entry> + <entry>Atlantic Std Time (Canada)</entry> + </row> + <row> + <entry>EDT</entry> + <entry>-4:00 </entry> + <entry>Eastern Daylight Time</entry> + </row> + <row> + <entry>ZP4</entry> + <entry>-4:00</entry> + <entry>GMT +4 hours</entry> + </row> + <row> + <entry>CDT</entry> + <entry>-5:00 </entry> + <entry>Central Daylight Time</entry> + </row> + <row> + <entry>EST</entry> + <entry>-5:00 </entry> + <entry>Eastern Standard Time</entry> + </row> + <row> + <entry>ZP5</entry> + <entry>-5:00</entry> + <entry>GMT +5 hours</entry> + </row> + <row> + <entry>CST</entry> + <entry>-6:00 </entry> + <entry>Central Std Time</entry> + </row> + <row> + <entry>MDT</entry> + <entry>-6:00</entry> + <entry>Mountain Daylight Time</entry> + </row> + <row> + <entry>ZP6</entry> + <entry>-6:00</entry> + <entry>GMT +6 hours</entry> + </row> + <row> + <entry>MST</entry> + <entry>-7:00</entry> + <entry>Mountain Standard Time</entry> + </row> + <row> + <entry>PDT</entry> + <entry>-7:00</entry> + <entry>Pacific Daylight Time</entry> + </row> + <row> + <entry>PST</entry> + <entry>-8:00</entry> + <entry>Pacific Std Time</entry> + </row> + <row> + <entry>YDT</entry> + <entry>-8:00</entry> + <entry>Yukon Daylight Time</entry> + </row> + <row> + <entry>HDT</entry> + <entry>-9:00</entry> + <entry>Hawaii/Alaska Daylight Time</entry> + </row> + <row> + <entry>YST</entry> + <entry>-9:00</entry> + <entry>Yukon Standard Time</entry> + </row> + <row> + <entry>AHST</entry> + <entry>-10:00 </entry> + <entry>Alaska-Hawaii Std Time</entry> + </row> + <row> + <entry>CAT</entry> + <entry>-10:00 </entry> + <entry>Central Alaska Time</entry> + </row> + <row> + <entry>NT</entry> + <entry>-11:00</entry> + <entry>Nome Time</entry> + </row> + <row> + <entry>IDLW</entry> + <entry>-12:00</entry> + <entry>International Date Line, West</entry> + </row> + </tbody> + </tgroup> + </table> + <note> + <para> + If the compiler option USE_AUSTRALIAN_RULES is set + then <literal>EST</literal> refers to Australia Eastern Std Time, + which has an offset of +10:00 hours from UTC. + </para> + </note> + </para> -This is why unix has the cal 9 1752 like this: - September 1752 - S M Tu W Th F S - 1 2 14 15 16 -17 18 19 20 21 22 23 -24 25 26 27 28 29 30 + <para> + Australian time zones and their naming variants + account for fully one quarter of all time zones in the + <productname>Postgres</productname> time zone lookup table. + </para> + + <procedure> + <title>Date/Time Input Interpretation</title> + + <para> + The date/time types are all decoded using a common set of routines. + </para> + + <step> + <para> + Break the input string into tokens and categorize each token as + a string, time, time zone, or number. + </para> + + <substeps> + <step> + <para> + If the token contains a colon (":"), this is a time string. + </para> + </step> + + <step> + <para> + If the token contains a dash ("-"), slash ("/"), or dot ("."), + this is a date string which may have a text month. + </para> + </step> + + <step> + <para> + If the token is numeric only, then it is either a single field + or an ISO-8601 concatenated date (e.g. "19990113" for January 13, 1999) + or time (e.g. 141516 for 14:15:16). + </para> + </step> + <step> + <para> + If the token starts with a plus ("+") or minus ("-"), + then it is either a time zone or a special field. + </para> + </step> + </substeps> + </step> + + <step> + <para> + If the token is a text string, match up with possible strings. + </para> + + <substeps> + <step> + <para> + Do a binary-search table lookup for the token + as either a special string (e.g. <literal>today</literal>), + day (e.g. <literal>Thursday</literal>), + month (e.g. <literal>January</literal>), or noise word (e.g. <literal>on</literal>). + </para> + <para> + Set field values and bit mask for fields. + For example, set year, month, day for <literal>today</literal>, and additionally + hour, minute, second for <literal>now</literal>. + </para> + </step> + + <step> + <para> + If not found, do a similar binary-search table lookup to match + the token with a time zone. + </para> + </step> + + <step> + <para> + If not found, throw an error. + </para> + </step> + </substeps> + </step> + + <step> + <para> + The token is a number or number field. + If there are more than 4 digits, + and if no other date fields have been previously read, then interpret + as a "concatenated date" (e.g. <literal>19990118</literal>). + </para> + + <substeps> + <step> + <para> + If there are more than 4 digits, + and if no other date fields have been previously read, then interpret + as a "concatenated date" (e.g. <literal>19990118</literal>). + </para> + </step> + + <step> + <para> + If three digits and a year has already been decoded, then interpret as day of year. + </para> + </step> + + <step> + <para> + If longer than two digits, then interpret as a year. + </para> + </step> + + <step> + <para> + If in European date mode, and if the day field has not yet been read, + and if the value is less than or equal to 31, then interpret as a day. + </para> + </step> + + <step> + <para> + If in non-European (US) date mode, and if the month field has not yet been read, + and if the value is less than or equal to 12, then interpret as a month. + </para> + </step> -My question is: -^^^^^^^^^^^^ + <step> + <para> + If the day field has not yet been read, + and if the value is less than or equal to 31, then interpret as a month. + </para> + </step> -If SQL92 says: + <step> + <para> + If the month field has not yet been read, + and if the value is less than or equal to 12, then interpret as a month. + </para> + </step> - (Second Informal Review Draft) ISO/IEC 9075:1992, Database - Language SQL- July 30, 1992 + <step> + <para> + Otherwise, interpret as a year. + </para> + </step> + </substeps> + </step> -5.3 literals - 22)Within the definition of a <datetime literal>, the <datetime - value>s are constrained by the natural rules for dates and -times - according to the Gregorian calendar. - ^^^^^^^^^^^^^^^ + <step> + <para> + If BC has been specified, negate the year and offset by one + (there is no year zero in the Gregorian calendar). + </para> + </step> -Dates between 1752-09-03 and 1752-09-13. -Are they valid dates? -^^^^^^^^^^^^^^^^ + <step> + <para> + If BC was not specified, and if the year field was two digits in length, then + adjust the year to 4 digits. If the field was less than 70, then add 2000; + otherwise, add 1900. + </para> + </step> + + </procedure> + </sect1> -> They have the nice property of correctly -> predicting/calculating any date more recent than something like 4013BC -> to far into the future, using the assumption that the length of the -> year is 365.25 days. This is a very recently adopted convention -> (sometime in the 1800s I had thought, but perhaps it was during the -> same "reform" in 1752). -> -> I've toyed with the idea of implementing a Chinese dynastic calendar, -> since it seems to be more predictable than historical European -> calendars. + <sect1> + <title>History</title> -People's Republic of China uses the Gregorian calendar -for civil purposes. Chinese calendar is used for determining -festivals. + <note> + <para> + Contributed by + <ulink url="jose@sferacarta.com">José Soares</ulink>. + </para> + </note> -The beginnings of the Chinese calendar can be traced back to the 14th -century BC. Legend has it that the Emperor Huangdi invented the -calendar in 2637 B + <para> + The Julian Day invented by the French scholar + Joseph Justus Scaliger (1540-1609) + and which probably takes its name from the Scaliger's father, + the Italian scholar Julius Caesar Scaliger (1484-1558). + Astronomers have used the Julian period to assign a unique number to + every day since 1 January 4713 BC. This is the so-called Julian Day + (JD). JD 0 designates the 24 hours from noon UTC on 1 January 4713 BC + to noon UTC on 2 January 4713 BC. + </para> + + <para> + Julian Day is different from Julian Date. + + The Julian calendar was introduced by Julius Caesar in 45 BC. It was + in common use until the 1582, when countries started changing to the + Gregorian calendar. + + In the Julian calendar, the tropical year is approximated as 365 1/4 + days = 365.25 days. This gives an error of 1 day in approximately + 128 days. + The accumulating calendar error prompted pope Gregory XIII + to reform the calendar in accordance with instructions + from the Council of Trent. + </para> + + <para> + In the Gregorian calendar, the tropical year is approximated as + 365 + 97 / 400 days = 365.2425 days. Thus it takes approximately 3300 + years for the tropical year to shift one day with respect to the + Gregorian calendar. + </para> + + <para> + The approximation 365+97/400 is achieved by having 97 leap years + every 400 years, using the following rules: + + <simplelist> + <member> + Every year divisible by 4 is a leap year. + </member> + <member> + However, every year divisible by 100 is not a leap year. + </member> + <member> + However, every year divisible by 400 is a leap year after all. + </member> + </simplelist> + + So, 1700, 1800, 1900, 2100, and 2200 are not leap years. But 1600, + 2000, and 2400 are leap years. + + By contrast, in the older Julian calendar only years divisible by 4 are leap years. + </para> + + <para> + The papal bull of February 1582 decreed that 10 days should be dropped + from October 1582 so that 15 October should follow immediately after + 4 October. + This was observed in Italy, Poland, Portugal, and Spain. Other Catholic + countries followed shortly after, but Protestant countries were + reluctant to change, and the Greek orthodox countries didn't change + until the start of this century. + + The reform was observed by Great Britain and Dominions (including what is + now the USA) in 1752. + Thus 2 Sep 1752 was followed by 14 Sep 1752. + + This is why Unix systems have <application>cal</application> + produce the following: + + <programlisting> +% cal 9 1752 + September 1752 + S M Tu W Th F S + 1 2 14 15 16 +17 18 19 20 21 22 23 +24 25 26 27 28 29 30 + </programlisting> + </para> -José + <note> + <para> + SQL92 states that + <quote>Within the definition of a <sgmltag>datetime literal</sgmltag>, + the <sgmltag>datetime value</sgmltag>s are constrained by the + natural rules for dates and times + according to the Gregorian calendar</quote>. + Dates between 1752-09-03 and 1752-09-13, although eliminated in + some countries by Papal fiat, conform to + <quote>natural rules</quote> and are hence valid dates. + </para> + </note> + <para> + Different calendars have been developed in various parts of the + world, many predating the Gregorian system. + For example, + the beginnings of the Chinese calendar can be traced back to the 14th + century BC. Legend has it that the Emperor Huangdi invented the + calendar in 2637 BC. + + The People's Republic of China uses the Gregorian calendar + for civil purposes. Chinese calendar is used for determining + festivals. + </para> + </sect1> +</appendix> +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:nil +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:1 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:"./reference.ced" +sgml-exposed-tags:nil +sgml-local-catalogs:"/usr/lib/sgml/catalog" +sgml-local-ecat-files:nil +End: +--> |