diff --git a/postgresql-simple-interval.cabal b/postgresql-simple-interval.cabal
--- a/postgresql-simple-interval.cabal
+++ b/postgresql-simple-interval.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: postgresql-simple-interval
-version: 1.0.0.0
+version: 1.0.1.0
 synopsis: A simple interval type for PostgreSQL.
 description:
   This library provides a simple interval type for PostgreSQL. It supports
@@ -64,6 +64,7 @@
   build-depends:
     persistent ^>=2.17,
     scientific ^>=0.3.8,
+    template-haskell >=2.15 && <2.24,
     text >=1.2.4 && <1.3 || >=2.0 && <2.2,
 
   -- cabal-gild: discover source/library
diff --git a/source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs b/source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs
--- a/source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs
+++ b/source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveLift #-}
 {-# LANGUAGE NumDecimals #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -27,6 +28,7 @@
 import qualified Database.PostgreSQL.Simple.ToField as Postgres
 import qualified Database.PostgreSQL.Simple.TypeInfo.Static as Postgres
 import qualified GHC.TypeLits as TypeLits
+import qualified Language.Haskell.TH.Syntax as TH
 
 -- | This type represents a PostgreSQL interval. Intervals can have month, day,
 -- and microsecond components. Each component is bounded, so they are not
@@ -53,7 +55,7 @@
     days :: !Int.Int32,
     microseconds :: !Int.Int64
   }
-  deriving (Eq, Show)
+  deriving (Eq, TH.Lift, Show)
 
 -- | Uses 'parse'. Ensures that the OID is 'Postgres.intervalOid'.
 instance Postgres.FromField Interval where
@@ -581,9 +583,7 @@
         <> " us"
 
 -- | Parses an interval. This is not a general purpose parser. It only supports
--- the formats that PostgreSQL generates. For example, it will fail to parse an
--- interval like @"1 week"@ because PostgreSQL never uses weeks when rendering
--- intervals.
+-- the formats that PostgreSQL generates.
 parse :: A.Parser Interval
 parse =
   -- Start with parsers that have non-empty prefixes, in order to avoid
@@ -602,10 +602,11 @@
 
 parseInfinities :: A.Parser Interval
 parseInfinities =
-  -- Both `-infinity` and `infinity` are new as of PostgreSQL 17.0.
+  -- `infinity` is new as of PostgreSQL 17.0.
   -- https://www.postgresql.org/message-id/E1r2rB1-005PHm-UL%40gemulon.postgresql.org
   A.choice
     [ MkInterval minBound minBound minBound <$ "-infinity",
+      MkInterval maxBound maxBound maxBound <$ "+infinity",
       MkInterval maxBound maxBound maxBound <$ "infinity"
     ]
 
@@ -636,6 +637,7 @@
     flip A.sepBy " " $
       A.choice
         [ Years <$> A.signed A.decimal <* maybePlural " year",
+          Weeks <$> A.signed A.decimal <* maybePlural " week",
           Months <$> A.signed A.decimal <* maybePlural " mon",
           Days <$> A.signed A.decimal <* maybePlural " day",
           Hours <$> A.signed A.decimal <* maybePlural " hour",
@@ -652,6 +654,7 @@
     flip A.sepBy " " $
       A.choice
         [ Years <$> A.signed A.decimal <* maybePlural " year",
+          Weeks <$> A.signed A.decimal <* maybePlural " week",
           Months <$> A.signed A.decimal <* maybePlural " mon",
           Days <$> A.signed A.decimal <* maybePlural " day"
         ]
@@ -688,6 +691,7 @@
 -- are accepted, like years and months.
 data Component
   = Years !Integer
+  | Weeks !Integer
   | Months !Integer
   | Days !Integer
   | Hours !Integer
@@ -701,6 +705,7 @@
 fromComponent :: Component -> Maybe Interval
 fromComponent c = case c of
   Years y -> fromYears =<< Bits.toIntegralSized y
+  Weeks w -> fromWeeks =<< Bits.toIntegralSized w
   Months m -> fromMonths <$> Bits.toIntegralSized m
   Days d -> fromDays <$> Bits.toIntegralSized d
   Hours h -> fromHours =<< Bits.toIntegralSized h
@@ -722,6 +727,7 @@
 negateComponent :: Component -> Component
 negateComponent c = case c of
   Years y -> Years (-y)
+  Weeks w -> Weeks (-w)
   Months m -> Months (-m)
   Days d -> Days (-d)
   Hours h -> Hours (-h)
diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs
--- a/source/test-suite/Main.hs
+++ b/source/test-suite/Main.hs
@@ -394,13 +394,38 @@
       let actual = Attoparsec.parseOnly I.parse "invalid"
       actual `H.shouldBe` Left "Failed reading: empty"
 
-    H.it "succeeds with positive infinity" $ do
+    H.it "succeeds with implicit positive infinity" $ do
       let actual = Attoparsec.parseOnly I.parse "infinity"
       actual `H.shouldBe` Right (I.MkInterval maxBound maxBound maxBound)
 
+    H.it "succeeds with explicit positive infinity" $ do
+      let actual = Attoparsec.parseOnly I.parse "+infinity"
+      actual `H.shouldBe` Right (I.MkInterval maxBound maxBound maxBound)
+
     H.it "succeeds with negative infinity" $ do
       let actual = Attoparsec.parseOnly I.parse "-infinity"
       actual `H.shouldBe` Right (I.MkInterval minBound minBound minBound)
+
+    H.describe "weeks" $ do
+      H.it "succeeds with zero" $ do
+        let actual = Attoparsec.parseOnly I.parse "0 weeks"
+        actual `H.shouldBe` Right (I.MkInterval 0 0 0)
+
+      H.it "succeeds with implicit positive" $ do
+        let actual = Attoparsec.parseOnly I.parse "1 week"
+        actual `H.shouldBe` Right (I.MkInterval 0 7 0)
+
+      H.it "succeeds with explicit positive" $ do
+        let actual = Attoparsec.parseOnly I.parse "+2 weeks"
+        actual `H.shouldBe` Right (I.MkInterval 0 14 0)
+
+      H.it "succeeds with negative" $ do
+        let actual = Attoparsec.parseOnly I.parse "-3 weeks"
+        actual `H.shouldBe` Right (I.MkInterval 0 (-21) 0)
+
+      H.it "succeeds with verbose" $ do
+        let actual = Attoparsec.parseOnly I.parse "@ 4 weeks"
+        actual `H.shouldBe` Right (I.MkInterval 0 28 0)
 
     Monad.forM_ intervalStyles $ \(_, field) ->
       Monad.forM_ examples $ \example -> do
