@@ -104,16 +104,19 @@ module Squeal.PostgreSQL.Expression
104104 , isUnknown
105105 , isNotUnknown
106106 -- ** Time
107+ , TimeOp (..)
107108 , currentDate
108109 , currentTime
109110 , currentTimestamp
110111 , localTime
111112 , localTimestamp
112− , TimeOp (..)
113+ , now
113114 , makeDate
114115 , makeTime
115116 , makeTimestamp
116117 , makeTimestamptz
118+ , interval_
119+ , TimeUnit (..)
117120 -- ** Text
118121 , lower
119122 , upper
@@ -1121,6 +1124,13 @@ localTime = UnsafeExpression "LOCALTIME"
11211124localTimestamp :: Expr (null 'PGtimestamp)
11221125localTimestamp = UnsafeExpression "LOCALTIMESTAMP"
11231126
1127+-- | Current date and time (equivalent to `currentTimestamp`)
1128+--
1129+-- >>> printSQL now
1130+-- now()
1131+now :: Expr (null 'PGtimestamptz)
1132+now = UnsafeExpression "now()"
1133+
11241134{-----------------------------------------
11251135text
11261136-----------------------------------------}
@@ -2530,3 +2540,30 @@ infixl 6 !+
25302540infixl 6 +!
25312541infixl 6 !-
25322542infixl 6 !-!
2543+
2544+data TimeUnit
2545+ = Years | Months | Weeks | Days
2546+ | Hours | Minutes | Seconds
2547+ | Microseconds | Milliseconds
2548+ | Decades | Centuries | Millennia
2549+ deriving (Eq, Ord, Show, Read, Enum, GHC.Generic)
2550+instance RenderSQL TimeUnit where
2551+ renderSQL = \case
2552+ Years -> "years"
2553+ Months -> "months"
2554+ Weeks -> "weeks"
2555+ Days -> "days"
2556+ Hours -> "hours"
2557+ Minutes -> "minutes"
2558+ Seconds -> "seconds"
2559+ Microseconds -> "microseconds"
2560+ Milliseconds -> "milliseconds"
2561+ Decades -> "decades"
2562+ Centuries -> "centuries"
2563+ Millennia -> "millennia"
2564+
2565+-- | >>> printSQL $ interval_ 7 Days
2566+-- INTERVAL '7.0 days'
2567+interval_ :: Double -> TimeUnit -> Expr (null 'PGinterval)
2568+interval_ num unit = UnsafeExpression $ "INTERVAL" <+>
2569+ "'" <> fromString (show num) <+> renderSQL unit <> "'"