diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 8fbb310..590ce3a 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -4327,9 +4327,14 @@ timestamp_part(PG_FUNCTION_ARGS)
 	struct pg_tm tt,
 			   *tm = &tt;
 
-	if (TIMESTAMP_NOT_FINITE(timestamp))
+	if (TIMESTAMP_IS_NOBEGIN(timestamp))
 	{
-		result = 0;
+		result = -get_float8_infinity();
+		PG_RETURN_FLOAT8(result);
+	}
+	else if (TIMESTAMP_IS_NOEND(timestamp))
+	{
+		result = get_float8_infinity();
 		PG_RETURN_FLOAT8(result);
 	}
 
@@ -4538,9 +4543,14 @@ timestamptz_part(PG_FUNCTION_ARGS)
 	struct pg_tm tt,
 			   *tm = &tt;
 
-	if (TIMESTAMP_NOT_FINITE(timestamp))
+	if (TIMESTAMP_IS_NOBEGIN(timestamp))
 	{
-		result = 0;
+		result = -get_float8_infinity();
+		PG_RETURN_FLOAT8(result);
+	}
+	else if (TIMESTAMP_IS_NOEND(timestamp))
+	{
+		result = get_float8_infinity();
 		PG_RETURN_FLOAT8(result);
 	}
 
diff --git a/src/test/regress/expected/date.out b/src/test/regress/expected/date.out
index 8923f60..88ac4b5 100644
--- a/src/test/regress/expected/date.out
+++ b/src/test/regress/expected/date.out
@@ -900,6 +900,27 @@ SELECT date 'tomorrow' - date 'yesterday' AS "Two days";
 --
 -- test extract!
 --
+-- epoch
+--
+SELECT EXTRACT(EPOCH FROM DATE '1970-01-01');     --  0
+ date_part 
+-----------
+         0
+(1 row)
+
+SELECT EXTRACT(EPOCH FROM DATE 'infinity');       --  Infinity
+ date_part 
+-----------
+  Infinity
+(1 row)
+
+SELECT EXTRACT(EPOCH FROM DATE '-infinity');      -- -Infinity
+ date_part 
+-----------
+ -Infinity
+(1 row)
+
+--
 -- century
 --
 SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2
@@ -962,6 +983,18 @@ SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True;     -- true
  t
 (1 row)
 
+SELECT EXTRACT(CENTURY FROM DATE 'infinity');      --  Infinity
+ date_part 
+-----------
+  Infinity
+(1 row)
+
+SELECT EXTRACT(CENTURY FROM DATE '-infinity');     -- -Infinity
+ date_part 
+-----------
+ -Infinity
+(1 row)
+
 --
 -- millennium
 --
@@ -1008,6 +1041,18 @@ SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE);         --  3
          3
 (1 row)
 
+SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity');      --  Infinity
+ date_part 
+-----------
+  Infinity
+(1 row)
+
+SELECT EXTRACT(MILLENNIUM FROM DATE '-infinity');     -- -Infinity
+ date_part 
+-----------
+ -Infinity
+(1 row)
+
 --
 -- decade
 --
@@ -1053,6 +1098,18 @@ SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); --  -2
         -2
 (1 row)
 
+SELECT EXTRACT(DECADE FROM DATE 'infinity');      --  Infinity
+ date_part 
+-----------
+  Infinity
+(1 row)
+
+SELECT EXTRACT(DECADE FROM DATE '-infinity');     -- -Infinity
+ date_part 
+-----------
+ -Infinity
+(1 row)
+
 --
 -- some other types:
 --
@@ -1069,6 +1126,37 @@ SELECT EXTRACT(CENTURY FROM TIMESTAMP '1970-03-20 04:30:00.00000'); -- 20
         20
 (1 row)
 
+SELECT EXTRACT(CENTURY FROM TIMESTAMP 'infinity');    --  Infinity
+ date_part 
+-----------
+  Infinity
+(1 row)
+
+SELECT EXTRACT(CENTURY FROM TIMESTAMP '-infinity');   -- -Infinity
+ date_part 
+-----------
+ -Infinity
+(1 row)
+
+-- on a timestamptz.
+SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '1970-01-01+00');     --  0
+ date_part 
+-----------
+         0
+(1 row)
+
+SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ 'infinity');          --  Infinity
+ date_part 
+-----------
+  Infinity
+(1 row)
+
+SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '-infinity');         -- -Infinity
+ date_part 
+-----------
+ -Infinity
+(1 row)
+
 -- on an interval
 SELECT EXTRACT(CENTURY FROM INTERVAL '100 y');  -- 1
  date_part 
diff --git a/src/test/regress/sql/date.sql b/src/test/regress/sql/date.sql
index a62e92a..d465f8d 100644
--- a/src/test/regress/sql/date.sql
+++ b/src/test/regress/sql/date.sql
@@ -212,6 +212,12 @@ SELECT date 'tomorrow' - date 'yesterday' AS "Two days";
 --
 -- test extract!
 --
+-- epoch
+--
+SELECT EXTRACT(EPOCH FROM DATE '1970-01-01');     --  0
+SELECT EXTRACT(EPOCH FROM DATE 'infinity');       --  Infinity
+SELECT EXTRACT(EPOCH FROM DATE '-infinity');      -- -Infinity
+--
 -- century
 --
 SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2
@@ -224,6 +230,8 @@ SELECT EXTRACT(CENTURY FROM DATE '1901-01-01');    -- 20
 SELECT EXTRACT(CENTURY FROM DATE '2000-12-31');    -- 20
 SELECT EXTRACT(CENTURY FROM DATE '2001-01-01');    -- 21
 SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True;     -- true
+SELECT EXTRACT(CENTURY FROM DATE 'infinity');      --  Infinity
+SELECT EXTRACT(CENTURY FROM DATE '-infinity');     -- -Infinity
 --
 -- millennium
 --
@@ -235,6 +243,8 @@ SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31');    --  2
 SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01');    --  3
 -- next test to be fixed on the turn of the next millennium;-)
 SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE);         --  3
+SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity');      --  Infinity
+SELECT EXTRACT(MILLENNIUM FROM DATE '-infinity');     -- -Infinity
 --
 -- decade
 --
@@ -245,12 +255,20 @@ SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); --   0
 SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); --  -1
 SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); --  -1
 SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); --  -2
+SELECT EXTRACT(DECADE FROM DATE 'infinity');      --  Infinity
+SELECT EXTRACT(DECADE FROM DATE '-infinity');     -- -Infinity
 --
 -- some other types:
 --
 -- on a timestamp.
 SELECT EXTRACT(CENTURY FROM NOW())>=21 AS True;       -- true
 SELECT EXTRACT(CENTURY FROM TIMESTAMP '1970-03-20 04:30:00.00000'); -- 20
+SELECT EXTRACT(CENTURY FROM TIMESTAMP 'infinity');    --  Infinity
+SELECT EXTRACT(CENTURY FROM TIMESTAMP '-infinity');   -- -Infinity
+-- on a timestamptz.
+SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '1970-01-01+00');     --  0
+SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ 'infinity');          --  Infinity
+SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '-infinity');         -- -Infinity
 -- on an interval
 SELECT EXTRACT(CENTURY FROM INTERVAL '100 y');  -- 1
 SELECT EXTRACT(CENTURY FROM INTERVAL '99 y');   -- 0
