Previously we threw an error. But make_date already allowed the case,
so it is inconsistent as well as unhelpful for make_timestamp not to.
Both functions continue to reject year zero.
Code and test fixes by Peter Eisentraut, doc changes by me
Discussion: https://postgr.es/m/
13c0992c-f15a-a0ca-d839-
91d3efd965d9@2ndquadrant.com
Create date from year, month and day fields
+ (negative years signify BC)
make_date(2013, 7, 15)
Create timestamp from year, month, day, hour, minute and seconds fields
+ (negative years signify BC)
make_timestamp(2013, 7, 15, 8, 15, 23.5)
Create timestamp with time zone from year, month, day, hour, minute
- and seconds fields; if
timezone is not
- specified, the current time zone is used
+ and seconds fields (negative years signify BC).
+ specified, the current time zone is used; the examples assume the
+ session time zone is Europe/London
make_timestamptz(2013, 7, 15, 8, 15, 23.5)
2013-07-15 08:15:23.5+01
+
+ make_timestamptz(2013, 7, 15, 8, 15, 23.5, 'America/New_York')
+ 2013-07-15 13:15:23.5+01
TimeOffset date;
TimeOffset time;
int dterr;
+ bool bc = false;
Timestamp result;
tm.tm_year = year;
tm.tm_mon = month;
tm.tm_mday = day;
- /*
- * Note: we'll reject zero or negative year values. Perhaps negatives
- * should be allowed to represent BC years?
- */
- dterr = ValidateDate(DTK_DATE_M, false, false, false, &tm);
+ /* Handle negative years as BC */
+ if (tm.tm_year < 0)
+ {
+ bc = true;
+ tm.tm_year = -tm.tm_year;
+ }
+
+ dterr = ValidateDate(DTK_DATE_M, false, false, bc, &tm);
if (dterr != 0)
ereport(ERROR,
(1 row)
-- should fail
+select make_date(0, 7, 15);
+ERROR: date field value out of range: 0-07-15
select make_date(2013, 2, 30);
ERROR: date field value out of range: 2013-02-30
select make_date(2013, 13, 1);
(4 rows)
-- timestamp numeric fields constructor
-SELECT make_timestamp(2014,12,28,6,30,45.887);
+SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887);
make_timestamp
------------------------------
Sun Dec 28 06:30:45.887 2014
(1 row)
+SELECT make_timestamp(-44, 3, 15, 12, 30, 15);
+ make_timestamp
+-----------------------------
+ Fri Mar 15 12:30:15 0044 BC
+(1 row)
+
+-- should fail
+select make_timestamp(0, 7, 15, 12, 30, 15);
+ERROR: date field value out of range: 0-07-15
select make_date(-44, 3, 15);
select make_time(8, 20, 0.0);
-- should fail
+select make_date(0, 7, 15);
select make_date(2013, 2, 30);
select make_date(2013, 13, 1);
select make_date(2013, 11, -1);
) d(d);
-- timestamp numeric fields constructor
-SELECT make_timestamp(2014,12,28,6,30,45.887);
+SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887);
+SELECT make_timestamp(-44, 3, 15, 12, 30, 15);
+-- should fail
+select make_timestamp(0, 7, 15, 12, 30, 15);