diff --git a/Database/HDBC/SqlValue.hs b/Database/HDBC/SqlValue.hs
--- a/Database/HDBC/SqlValue.hs
+++ b/Database/HDBC/SqlValue.hs
@@ -22,6 +22,7 @@
 import Data.Ratio
 import Control.Monad.Error
 import Data.Convertible
+import Data.Fixed
 
 quickError :: (Typeable a, Convertible SqlValue a) => SqlValue -> ConvertResult a
 quickError sv = convError "incompatible types" sv
@@ -258,18 +259,22 @@
     safeConvert (SqlLocalDate x) = 
         return . formatTime defaultTimeLocale (iso8601DateFormat Nothing) $ x
     safeConvert (SqlLocalTimeOfDay x) = 
-        return . formatTime defaultTimeLocale "%T" $ x
+        return . formatTime defaultTimeLocale "%T%Q" $ x
     safeConvert (SqlZonedLocalTimeOfDay tod tz) = 
-        return $ formatTime defaultTimeLocale "%T " tod ++
+        return $ formatTime defaultTimeLocale "%T%Q " tod ++
                  formatTime defaultTimeLocale "%z" tz
     safeConvert (SqlLocalTime x) = 
-        return . formatTime defaultTimeLocale (iso8601DateFormat (Just "%T")) $ x
+        return . formatTime defaultTimeLocale (iso8601DateFormat (Just "%T%Q")) $ x
     safeConvert (SqlZonedTime x) = 
-        return . formatTime defaultTimeLocale (iso8601DateFormat (Just "%T %z")) $ x
+        return . formatTime defaultTimeLocale (iso8601DateFormat (Just "%T%Q %z")) $ x
     safeConvert (SqlUTCTime x) = 
-        return . formatTime defaultTimeLocale (iso8601DateFormat (Just "%T")) $ x
-    safeConvert (SqlDiffTime x) = return $ show ((truncate x)::Integer)
-    safeConvert (SqlPOSIXTime x) = return $ show ((truncate x)::Integer)
+        return . formatTime defaultTimeLocale (iso8601DateFormat (Just "%T%Q")) $ x
+    safeConvert (SqlDiffTime x) = return $ showFixed True fixedval
+            where fixedval :: Pico
+                  fixedval = fromRational . toRational $ x
+    safeConvert (SqlPOSIXTime x) = return $ showFixed True fixedval
+            where fixedval :: Pico
+                  fixedval = fromRational . toRational $ x
     safeConvert (SqlEpochTime x) = return . show $ x
     safeConvert (SqlTimeDiff x) = return . show $ x
     safeConvert y@(SqlNull) = quickError y
@@ -629,7 +634,7 @@
 instance Convertible TimeOfDay SqlValue where
     safeConvert = return . SqlLocalTimeOfDay
 instance Convertible SqlValue TimeOfDay where
-    safeConvert (SqlString x) = parseTime' "%T" x
+    safeConvert (SqlString x) = parseTime' "%T%Q" x
     safeConvert (SqlByteString x) = safeConvert (SqlString (BUTF8.toString x))
     safeConvert (SqlInt32 x) = return . timeToTimeOfDay . fromIntegral $ x
     safeConvert (SqlInt64 x) = return . timeToTimeOfDay . fromIntegral $ x
@@ -657,8 +662,8 @@
     safeConvert (tod, tz) = return (SqlZonedLocalTimeOfDay tod tz)
 instance Convertible SqlValue (TimeOfDay, TimeZone) where
     safeConvert (SqlString x) = 
-        do tod <- parseTime' "%T %z" x
-           tz <- case parseTime defaultTimeLocale "%T %z" x of
+        do tod <- parseTime' "%T%Q %z" x
+           tz <- case parseTime defaultTimeLocale "%T%Q %z" x of
                       Nothing -> convError "Couldn't extract timezone in" (SqlString x)
                       Just y -> Right y
            return (tod, tz)
@@ -688,7 +693,7 @@
 instance Convertible LocalTime SqlValue where
     safeConvert = return . SqlLocalTime
 instance Convertible SqlValue LocalTime where
-    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T")) x
+    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T%Q")) x
     safeConvert (SqlByteString x) = safeConvert (SqlString (BUTF8.toString x))
     safeConvert y@(SqlInt32 _) = quickError y
     safeConvert y@(SqlInt64 _) = quickError y
@@ -714,7 +719,7 @@
 instance Convertible ZonedTime SqlValue where
     safeConvert = return . SqlZonedTime
 instance Convertible SqlValue ZonedTime where
-    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T %z")) x
+    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T%Q %z")) x
     safeConvert (SqlByteString x) = safeConvert (SqlString (BUTF8.toString x))
     safeConvert (SqlInt32 x) = safeConvert (SqlInteger (fromIntegral x))
     safeConvert (SqlInt64 x) = safeConvert (SqlInteger (fromIntegral x))
@@ -740,7 +745,7 @@
 instance Convertible UTCTime SqlValue where
     safeConvert = return . SqlUTCTime
 instance Convertible SqlValue UTCTime where
-    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T")) x
+    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T%Q")) x
     safeConvert (SqlByteString x) = safeConvert (SqlString (BUTF8.toString x))
     safeConvert y@(SqlInt32 _) = safeConvert y >>= return . posixSecondsToUTCTime
     safeConvert y@(SqlInt64 _) = safeConvert y >>= return . posixSecondsToUTCTime
@@ -763,11 +768,28 @@
     safeConvert y@(SqlTimeDiff _) = convError "incompatible types (did you mean SqlPOSIXTime?)" y
     safeConvert y@SqlNull = quickError y
 
+stringToPico :: String -> ConvertResult Pico
+stringToPico s =
+    let (base, fracwithdot) = span (/= '.') s
+        shortfrac = drop 1 fracwithdot -- strip of dot; don't use tail because it may be empty
+        frac = take 12 (rpad 12 '0' shortfrac)
+        rpad :: Int -> a -> [a] -> [a]
+                -- next line lifted from Data.Time
+        rpad n c xs = xs ++ replicate (n - length xs) c
+        mkPico :: Integer -> Integer -> Pico
+                -- next line also lifted from Data.Time
+        mkPico i f = fromInteger i + fromRational (f % 1000000000000)
+    in do parsedBase <- read' base
+          parsedFrac <- read' frac
+          return (mkPico parsedBase parsedFrac)
+
 instance Convertible NominalDiffTime SqlValue where
     safeConvert = return . SqlDiffTime
 instance Convertible SqlValue NominalDiffTime where
-    safeConvert (SqlString x) = read' x >>= return . fromInteger
-    safeConvert (SqlByteString x) = read' (BUTF8.toString x) >>= return . fromInteger
+    safeConvert (SqlString x) = stringToPico x >>= 
+                                return . realToFrac
+    safeConvert (SqlByteString x) = (stringToPico (BUTF8.toString x)) >>=
+                                    return . realToFrac
     safeConvert (SqlInt32 x) = return . fromIntegral $ x
     safeConvert (SqlInt64 x) = return . fromIntegral $ x
     safeConvert (SqlWord32 x) = return . fromIntegral $ x
@@ -821,7 +843,9 @@
 instance Convertible ST.TimeDiff SqlValue where
     safeConvert x = safeConvert x >>= return . SqlDiffTime
 instance Convertible SqlValue ST.TimeDiff where
-    safeConvert (SqlString x) = ((read' x)::ConvertResult Integer) >>= safeConvert
+    safeConvert y@(SqlString _) = 
+        do r <- safeConvert y
+           safeConvert (SqlDiffTime r)
     safeConvert (SqlByteString x) = safeConvert . SqlString . BUTF8.toString $ x
     safeConvert (SqlInt32 x) = secs2td (fromIntegral x)
     safeConvert (SqlInt64 x) = secs2td (fromIntegral x)
diff --git a/HDBC.cabal b/HDBC.cabal
--- a/HDBC.cabal
+++ b/HDBC.cabal
@@ -1,5 +1,5 @@
 Name: HDBC
-Version: 2.0.1
+Version: 2.1.0
 License: LGPL
 Maintainer: John Goerzen <jgoerzen@complete.org>
 Author: John Goerzen
