diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 34fea16eeeeb58d2c76d1e028eadd3f46e834c3f..ae22ee5f7fae64873414b4a2c0b715d4f55c1e9a 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -6684,8 +6684,10 @@ SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); <term><literal>epoch</literal></term> <listitem> <para> - For <type>date</type> and <type>timestamp</type> values, the + For <type>timestamp with time zone</type> values, the number of seconds since 1970-01-01 00:00:00 UTC (can be negative); + for <type>date</type> and <type>timestamp</type> values, the + number of seconds since 1970-01-01 00:00:00 local time; for <type>interval</type> values, the total number of seconds in the interval </para> diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 9a7238be38d03d2de0a5850527930e8f66d72909..a3e1e94a2b22a253b1372f02230d783834ad9bdb 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -4066,32 +4066,13 @@ timestamp_part(PG_FUNCTION_ARGS) switch (val) { case DTK_EPOCH: - { - int tz; - TimestampTz timestamptz; - - /* - * convert to timestamptz to produce consistent results - */ - if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("timestamp out of range"))); - - tz = DetermineTimeZoneOffset(tm, session_timezone); - - if (tm2timestamp(tm, fsec, &tz, ×tamptz) != 0) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("timestamp out of range"))); - #ifdef HAVE_INT64_TIMESTAMP - result = (timestamptz - SetEpochTimestamp()) / 1000000.0; + result = (timestamp - SetEpochTimestamp()) / 1000000.0; #else - result = timestamptz - SetEpochTimestamp(); + result = timestamp - SetEpochTimestamp(); #endif break; - } + case DTK_DOW: case DTK_ISODOW: if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)