diff --git a/eventful-sql-common.cabal b/eventful-sql-common.cabal
--- a/eventful-sql-common.cabal
+++ b/eventful-sql-common.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           eventful-sql-common
-version:        0.1.2
+version:        0.1.3
 synopsis:       Common library for SQL event stores
 description:    Common library for SQL event stores
 category:       Database,Eventsourcing
diff --git a/src/Eventful/Store/Sql/Operations.hs b/src/Eventful/Store/Sql/Operations.hs
--- a/src/Eventful/Store/Sql/Operations.hs
+++ b/src/Eventful/Store/Sql/Operations.hs
@@ -47,7 +47,7 @@
   => SqlEventStoreConfig entity serialized
   -> GloballyOrderedEventStore serialized (SqlPersistT m)
 sqlGloballyOrderedEventStore config =
-  GloballyOrderedEventStore $ sqlGetAllEventsFromSequence config
+  GloballyOrderedEventStore $ sqlGetAllEventsInRange config
 
 sqlEventToGloballyOrdered
   :: SqlEventStoreConfig entity serialized
@@ -80,27 +80,44 @@
   :: (MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend)
   => SqlEventStoreConfig entity serialized
   -> UUID
-  -> Maybe EventVersion
+  -> EventStoreQueryRange EventVersion
   -> SqlPersistT m [StoredEvent serialized]
-sqlGetAggregateEvents config@SqlEventStoreConfig{..} uuid mVers = do
-  let
-    constraints =
-      (sqlEventStoreConfigUUIDField ==. uuid) :
-      maybe [] (\vers -> [sqlEventStoreConfigVersionField >=. vers]) mVers
-  entities <- selectList constraints [Asc sqlEventStoreConfigVersionField]
+sqlGetAggregateEvents config@SqlEventStoreConfig{..} uuid EventStoreQueryRange{..} = do
+  entities <- selectList filters selectOpts
   return $ sqlEventToStored config . entityVal <$> entities
+  where
+    startFilter =
+      case eventStoreQueryRangeStart of
+        StartFromBeginning -> []
+        StartQueryAt start -> [sqlEventStoreConfigVersionField >=. start]
+    (endFilter, endSelectOpt) =
+      case eventStoreQueryRangeLimit of
+        NoQueryLimit -> ([], [])
+        MaxNumberOfEvents maxNum -> ([], [LimitTo maxNum])
+        StopQueryAt stop -> ([sqlEventStoreConfigVersionField <=. stop], [])
+    filters = (sqlEventStoreConfigUUIDField ==. uuid) : startFilter ++ endFilter
+    selectOpts = Asc sqlEventStoreConfigSequenceNumberField : endSelectOpt
 
-sqlGetAllEventsFromSequence
+sqlGetAllEventsInRange
   :: (MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend)
   => SqlEventStoreConfig entity serialized
-  -> SequenceNumber
+  -> EventStoreQueryRange SequenceNumber
   -> SqlPersistT m [GloballyOrderedEvent serialized]
-sqlGetAllEventsFromSequence config@SqlEventStoreConfig{..} seqNum = do
-  entities <-
-    selectList
-    [sqlEventStoreConfigSequenceNumberField >=. sqlEventStoreConfigMakeKey seqNum]
-    [Asc sqlEventStoreConfigSequenceNumberField]
+sqlGetAllEventsInRange config@SqlEventStoreConfig{..} EventStoreQueryRange{..} = do
+  entities <- selectList filters selectOpts
   return $ sqlEventToGloballyOrdered config <$> entities
+  where
+    startFilter =
+      case eventStoreQueryRangeStart of
+        StartFromBeginning -> []
+        StartQueryAt start -> [sqlEventStoreConfigSequenceNumberField >=. sqlEventStoreConfigMakeKey start]
+    (endFilter, endSelectOpt) =
+      case eventStoreQueryRangeLimit of
+        NoQueryLimit -> ([], [])
+        MaxNumberOfEvents maxNum -> ([], [LimitTo maxNum])
+        StopQueryAt stop -> ([sqlEventStoreConfigSequenceNumberField <=. sqlEventStoreConfigMakeKey stop], [])
+    filters = startFilter ++ endFilter
+    selectOpts = Asc sqlEventStoreConfigSequenceNumberField : endSelectOpt
 
 sqlMaxEventVersion
   :: (MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend)
