</sect1>
-<sect1>
-<title>Date/Time Types</title>
-
-<para>
-There are two fundamental kinds of date and time measurements:
- absolute clock times and relative time intervals.
-Both kinds of quantities should have behaviors demonstrating both
-continuity and smoothness.
-<productname>Postgres</productname> supplies two primary user-oriented
-date and time types,
-<type>datetime</type> and <type>timespan</type>, as well as
-the related <acronym>SQL92</acronym> types <type>timestamp</type>,
-<type>interval</type>,
-<type>date</type> and <type>time</type>.
-</para>
-
-<para>
-In a future release, <type>datetime</type> and <type>timespan</type> are likely
-to merge with the <acronym>SQL92</acronym> types <type>timestamp</type>,
-<type>interval</type>.
-Other date and time types are also available, mostly
-for historical reasons.
-</para>
-
-<para>
-<table tocentry="1">
-<title><productname>Postgres</productname> Date/Time Types</title>
-<titleabbrev>Date/Time</titleabbrev>
-<tgroup cols="4">
-<thead>
- <row>
- <entry>Date/Time Type</entry>
- <entry>Storage</entry>
- <entry>Recommendation</entry>
- <entry>Description</entry>
- </row>
-</thead>
-<tbody>
- <row>
- <entry>abstime</entry>
- <entry>4 bytes</entry>
- <entry>original date and time</entry>
- <entry>limited range</entry>
- </row>
- <row>
- <entry>date</entry>
- <entry>4 bytes</entry>
- <entry><acronym>SQL92</acronym> type</entry>
- <entry>wide range</entry>
- </row>
- <row>
- <entry>datetime</entry>
- <entry>8 bytes</entry>
- <entry>best general date and time</entry>
- <entry>wide range, high precision</entry>
- </row>
- <row>
- <entry>interval</entry>
- <entry>12 bytes</entry>
- <entry><acronym>SQL92</acronym> type</entry>
- <entry>equivalent to timespan</entry>
- </row>
- <row>
- <entry>reltime</entry>
- <entry>4 bytes</entry>
- <entry>original time interval</entry>
- <entry>limited range, low precision</entry>
- </row>
- <row>
- <entry>time</entry>
- <entry>4 bytes</entry>
- <entry><acronym>SQL92</acronym> type</entry>
- <entry>wide range</entry>
- </row>
- <row>
- <entry>timespan</entry>
- <entry>12 bytes</entry>
- <entry>best general time interval</entry>
- <entry>wide range, high precision</entry>
- </row>
- <row>
- <entry>timestamp</entry>
- <entry>4 bytes</entry>
- <entry><acronym>SQL92</acronym> type</entry>
- <entry>limited range</entry>
- </row>
-</tbody>
-</tgroup>
-</table>
-
-<type>timestamp</type> is currently implemented separately from
-<type>datetime</type>, although they share input and output routines.
-</para>
+ <sect1>
+ <title>Date/Time Types</title>
+
+ <para>
+ There are two fundamental kinds of date and time measurements
+ provided by <productname>Postgres</productname>:
+ absolute clock times and relative time intervals.
+ Both kinds of time measurements should demonstrate both
+ continuity and smoothness.
+ </para>
-<para>
-<table tocentry="1">
-<title><productname>Postgres</productname> Date/Time Ranges</title>
-<titleabbrev>Ranges</titleabbrev>
-<tgroup cols="4">
-<thead>
- <row>
- <entry>Date/Time Type</entry>
- <entry>Earliest</entry>
- <entry>Latest</entry>
- <entry>Resolution</entry>
- </row>
-</thead>
-<tbody>
- <row>
- <entry>abstime</entry>
- <entry>1901-12-14</entry>
- <entry>2038-01-19</entry>
- <entry>1 sec</entry>
- </row>
- <row>
- <entry>date</entry>
- <entry>4713 BC</entry>
- <entry>32767 AD</entry>
- <entry>1 day</entry>
- </row>
- <row>
- <entry>datetime</entry>
- <entry>4713 BC</entry>
- <entry>1465001 AD</entry>
- <entry>1 microsec to 14 digits</entry>
- </row>
- <row>
- <entry>interval</entry>
- <entry>-178000000 years</entry>
- <entry>178000000 years</entry>
- <entry>1 microsec</entry>
- </row>
- <row>
- <entry>reltime</entry>
- <entry>-68 years</entry>
- <entry>+68 years</entry>
- <entry>1 sec</entry>
- </row>
- <row>
- <entry>time</entry>
- <entry>00:00:00.00</entry>
- <entry>23:59:59.99</entry>
- <entry>1 microsec</entry>
- </row>
- <row>
- <entry>timespan</entry>
- <entry>-178000000 years</entry>
- <entry>178000000 years</entry>
- <entry>1 microsec (14 digits)</entry>
- </row>
- <row>
- <entry>timestamp</entry>
- <entry>1901-12-14</entry>
- <entry>2038-01-19</entry>
- <entry>1 sec</entry>
- </row>
-</tbody>
-</tgroup>
-</table>
-</para>
+ <para>
+ <productname>Postgres</productname> supplies two primary user-oriented
+ date and time types,
+ <type>datetime</type> and <type>timespan</type>, as well as
+ the related <acronym>SQL92</acronym> types <type>timestamp</type>,
+ <type>interval</type>,
+ <type>date</type> and <type>time</type>.
+ </para>
-<para>
-<productname>Postgres</productname> endeavors to be compatible with
-<acronym>SQL92</acronym> definitions for typical usage.
-The <acronym>SQL92</acronym> standard has an odd mix of date and
-time types and capabilities. Two obvious problems are:
+ <para>
+ In a future release, <type>datetime</type> and <type>timespan</type> are likely
+ to merge with the <acronym>SQL92</acronym> types <type>timestamp</type>,
+ <type>interval</type>.
+ Other date and time types are also available, mostly
+ for historical reasons.
+ </para>
-<itemizedlist>
-<listitem>
-<para>
-Although the <type>date</type> type
-does not have an associated time zone, the
-<type>time</type> type can or does.</para></listitem>
+ <para>
+ <table tocentry="1">
+ <title><productname>Postgres</productname> Date/Time Types</title>
+ <titleabbrev>Date/Time</titleabbrev>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Date/Time Type</entry>
+ <entry>Storage</entry>
+ <entry>Recommendation</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>abstime</entry>
+ <entry>4 bytes</entry>
+ <entry>original date and time</entry>
+ <entry>limited range</entry>
+ </row>
+ <row>
+ <entry>date</entry>
+ <entry>4 bytes</entry>
+ <entry><acronym>SQL92</acronym> type</entry>
+ <entry>wide range</entry>
+ </row>
+ <row>
+ <entry>datetime</entry>
+ <entry>8 bytes</entry>
+ <entry>best general date and time</entry>
+ <entry>wide range, high precision</entry>
+ </row>
+ <row>
+ <entry>interval</entry>
+ <entry>12 bytes</entry>
+ <entry><acronym>SQL92</acronym> type</entry>
+ <entry>equivalent to timespan</entry>
+ </row>
+ <row>
+ <entry>reltime</entry>
+ <entry>4 bytes</entry>
+ <entry>original time interval</entry>
+ <entry>limited range, low precision</entry>
+ </row>
+ <row>
+ <entry>time</entry>
+ <entry>4 bytes</entry>
+ <entry><acronym>SQL92</acronym> type</entry>
+ <entry>wide range</entry>
+ </row>
+ <row>
+ <entry>timespan</entry>
+ <entry>12 bytes</entry>
+ <entry>best general time interval</entry>
+ <entry>wide range, high precision</entry>
+ </row>
+ <row>
+ <entry>timestamp</entry>
+ <entry>4 bytes</entry>
+ <entry><acronym>SQL92</acronym> type</entry>
+ <entry>limited range</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <type>timestamp</type> is currently implemented separately from
+ <type>datetime</type>, although they share input and output routines.
+ </para>
-<listitem>
-<para>
-The default time zone is specified as a constant integer offset
-from GMT/UTC.</para></listitem>
+ <para>
+ <table tocentry="1">
+ <title><productname>Postgres</productname> Date/Time Ranges</title>
+ <titleabbrev>Ranges</titleabbrev>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Date/Time Type</entry>
+ <entry>Earliest</entry>
+ <entry>Latest</entry>
+ <entry>Resolution</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>abstime</entry>
+ <entry>1901-12-14</entry>
+ <entry>2038-01-19</entry>
+ <entry>1 sec</entry>
+ </row>
+ <row>
+ <entry>date</entry>
+ <entry>4713 BC</entry>
+ <entry>32767 AD</entry>
+ <entry>1 day</entry>
+ </row>
+ <row>
+ <entry>datetime</entry>
+ <entry>4713 BC</entry>
+ <entry>1465001 AD</entry>
+ <entry>1 microsec to 14 digits</entry>
+ </row>
+ <row>
+ <entry>interval</entry>
+ <entry>-178000000 years</entry>
+ <entry>178000000 years</entry>
+ <entry>1 microsec</entry>
+ </row>
+ <row>
+ <entry>reltime</entry>
+ <entry>-68 years</entry>
+ <entry>+68 years</entry>
+ <entry>1 sec</entry>
+ </row>
+ <row>
+ <entry>time</entry>
+ <entry>00:00:00.00</entry>
+ <entry>23:59:59.99</entry>
+ <entry>1 microsec</entry>
+ </row>
+ <row>
+ <entry>timespan</entry>
+ <entry>-178000000 years</entry>
+ <entry>178000000 years</entry>
+ <entry>1 microsec (14 digits)</entry>
+ </row>
+ <row>
+ <entry>timestamp</entry>
+ <entry>1901-12-14</entry>
+ <entry>2038-01-19</entry>
+ <entry>1 sec</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </para>
-</itemizedlist>
+ <sect2>
+ <title>SQL92 Conventions</title>
-However, time zones in the real world can have no meaning unless
-associated with a date as well as a time
-since the offset may vary through the year with daylight savings
-time boundaries.
-</para>
+ <para>
+ <productname>Postgres</productname> endeavors to be compatible with
+ <acronym>SQL92</acronym> definitions for typical usage.
+ However, the <acronym>SQL92</acronym> standard has an odd mix of date and
+ time types and capabilities. Two obvious problems are:
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Although the <type>date</type> type
+ does not have an associated time zone, the
+ <type>time</type> type can or does.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The default time zone is specified as a constant integer offset
+ from GMT/UTC.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+
+ Time zones in the real world can have no meaning unless
+ associated with a date as well as a time
+ since the offset may vary through the year with daylight savings
+ time boundaries.
+ </para>
-<para>
-To address these difficulties, <productname>Postgres</productname>
-associates time zones only with date and time
-types which contain both date and time,
- and assumes local time for any type containing only
-date or time. Further, time zone support is derived from
-the underlying operating system
-time zone capabilities, and hence can handle daylight savings time
-and other expected behavior.
-</para>
+ <para>
+ To address these difficulties, <productname>Postgres</productname>
+ associates time zones only with date and time
+ types which contain both date and time,
+ and assumes local time for any type containing only
+ date or time. Further, time zone support is derived from
+ the underlying operating system
+ time zone capabilities, and hence can handle daylight savings time
+ and other expected behavior.
+ </para>
-<para>
-In future releases, the number of date/time types will decrease,
-with the current implementation of
-<type>datetime</type> becoming <type>timestamp</type>,
-<type>timespan</type> becoming <type>interval</type>,
-and (possibly) <type>abstime</type> and <type>reltime</type>
-being deprecated in favor of <type>timestamp</type> and <type>interval</type>.
-The more arcane features of the date/time definitions from
-the <acronym>SQL92</acronym> standard are not likely to be pursued.
-</para>
+ <para>
+ In future releases, the number of date/time types will decrease,
+ with the current implementation of
+ <type>datetime</type> becoming <type>timestamp</type>,
+ <type>timespan</type> becoming <type>interval</type>,
+ and (possibly) <type>abstime</type> and <type>reltime</type>
+ being deprecated in favor of <type>timestamp</type> and <type>interval</type>.
+ The more arcane features of the date/time definitions from
+ the <acronym>SQL92</acronym> standard are not likely to be pursued.
+ </para>
+ </sect2>
<sect2>
<title>Date/Time Styles</title>
</sect2>
-<sect2>
-<title>Time Zones</title>
+ <sect2>
+ <title>Calendar</title>
-<para>
-<productname>Postgres</productname> obtains time zone support
-from the underlying operating system.
-All dates and times are stored internally in Universal Coordinated Time (UTC),
- alternately known as Greenwich Mean Time (GMT).
-Times are converted to local time on the database server before being
-sent to the client frontend, hence by default are in the server time zone.</para>
+ <para>
+ <productname>Postgres</productname> uses Julian dates
+ for all date/time calculations. 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.2425 days.
+ </para>
-<para>
-There are several ways to affect the time zone behavior:
+ <para>
+ Date conventions before the 19th century make for interesting reading,
+ but are not consistant enough to warrant coding into a date/time handler.
+ </para>
+ </sect2>
-<itemizedlist spacing="compact" mark="bullet">
-<listitem>
-<para>
-The TZ environment variable used by the backend directly
- on postmaster startup as the default time zone.
-</para>
-</listitem>
-<listitem>
-<para>
-The PGTZ environment variable set at the client used by libpq
-to send time zone information to the backend upon connection.
-</para>
-</listitem>
-<listitem>
-<para>
-The <acronym>SQL</acronym> command <command>SET TIME ZONE</command>
-sets the time zone for the session.
-</para>
-</listitem>
-</itemizedlist></para>
+ <sect2>
+ <title>Time Zones</title>
-<para>
- If an invalid time zone is specified,
-the time zone becomes GMT (on most systems anyway).
-</para>
-</sect2>
+ <para>
+ <productname>Postgres</productname> obtains time zone support
+ from the underlying operating system for dates between 1902 and
+ 2038 (near the typical date limits for Unix-style
+ systems). Outside of this range, all dates are assumed to be
+ specified and used in Universal Coordinated Time (UTC).
+ </para>
+
+ <para>
+ All dates and times are stored internally in Universal UTC,
+ alternately known as Greenwich Mean Time (GMT).
+ Times are converted to local time on the database server before being
+ sent to the client frontend, hence by default are in the server
+ time zone.
+ </para>
+
+ <para>
+ There are several ways to affect the time zone behavior:
+
+ <itemizedlist spacing="compact" mark="bullet">
+ <listitem>
+ <para>
+ The TZ environment variable used by the backend directly
+ on postmaster startup as the default time zone.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The PGTZ environment variable set at the client used by libpq
+ to send time zone information to the backend upon connection.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <acronym>SQL</acronym> command <command>SET TIME ZONE</command>
+ sets the time zone for the session.
+ </para>
+ </listitem>
+ </itemizedlist></para>
+
+ <para>
+ If an invalid time zone is specified,
+ the time zone becomes GMT (on most systems anyway).
+ </para>
+ </sect2>
<sect2>
<title>Date/Time Input</title>