/* abstime_timestamptz() * Convert abstime to timestamp with time zone. */ Datum abstime_timestamptz(PG_FUNCTION_ARGS) { AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0); TimestampTz result; struct pg_tm tt, *tm = &tt; int tz; char zone[MAXDATELEN + 1], *tzn = zone; switch (abstime) { case INVALID_ABSTIME: ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot convert abstime \"invalid\" to timestamp"), errOmitLocation(true))); TIMESTAMP_NOBEGIN(result); break; case NOSTART_ABSTIME: TIMESTAMP_NOBEGIN(result); break; case NOEND_ABSTIME: TIMESTAMP_NOEND(result); break; default: abstime2tm(abstime, &tz, tm, &tzn); if (tm2timestamp(tm, 0, &tz, &result) != 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"), errOmitLocation(true))); break; }; PG_RETURN_TIMESTAMP(result); }
/* abstimeout() * Given an AbsoluteTime return the English text version of the date */ Datum abstimeout(PG_FUNCTION_ARGS) { AbsoluteTime time = PG_GETARG_ABSOLUTETIME(0); char *result; int tz; double fsec = 0; struct pg_tm tt, *tm = &tt; char buf[MAXDATELEN + 1]; char zone[MAXDATELEN + 1], *tzn = zone; switch (time) { /* * Note that timestamp no longer supports 'invalid'. Retain * 'invalid' for abstime for now, but dump it someday. */ case INVALID_ABSTIME: strcpy(buf, INVALID); break; case NOEND_ABSTIME: strcpy(buf, LATE); break; case NOSTART_ABSTIME: strcpy(buf, EARLY); break; default: abstime2tm(time, &tz, tm, &tzn); EncodeDateTime(tm, fsec, &tz, &tzn, DateStyle, buf); break; } result = pstrdup(buf); PG_RETURN_CSTRING(result); }