diff --git a/typo3/sysext/scheduler/Classes/Task/TableGarbageCollectionTask.php b/typo3/sysext/scheduler/Classes/Task/TableGarbageCollectionTask.php
index d790f0676a25803b3baf72dea92757df22d6a3b4..a3360130c6c7fa14cea84f712c9a1d0b87b7341f 100644
--- a/typo3/sysext/scheduler/Classes/Task/TableGarbageCollectionTask.php
+++ b/typo3/sysext/scheduler/Classes/Task/TableGarbageCollectionTask.php
@@ -13,6 +13,9 @@ namespace TYPO3\CMS\Scheduler\Task;
  *
  * The TYPO3 project - inspiring people to share!
  */
+use Doctrine\DBAL\DBALException;
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * Remove old entries from tables.
@@ -23,7 +26,7 @@ namespace TYPO3\CMS\Scheduler\Task;
  * $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\TYPO3\CMS\Scheduler\Task\TableGarbageCollectionTask::class]['options']['tables']
  * See ext_localconf.php of scheduler extension for an example
  */
-class TableGarbageCollectionTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask
+class TableGarbageCollectionTask extends AbstractTask
 {
     /**
      * @var bool True if all tables should be cleaned up
@@ -48,7 +51,7 @@ class TableGarbageCollectionTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask
      */
     public function execute()
     {
-        $tableConfigurations = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\TYPO3\CMS\Scheduler\Task\TableGarbageCollectionTask::class]['options']['tables'];
+        $tableConfigurations = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][TableGarbageCollectionTask::class]['options']['tables'];
         $tableHandled = false;
         foreach ($tableConfigurations as $tableName => $configuration) {
             if ($this->allTables || $tableName === $this->table) {
@@ -57,7 +60,7 @@ class TableGarbageCollectionTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask
             }
         }
         if (!$tableHandled) {
-            throw new \RuntimeException(\TYPO3\CMS\Scheduler\Task\TableGarbageCollectionTask::class . ' misconfiguration: ' . $this->table . ' does not exist in configuration', 1308354399);
+            throw new \RuntimeException(TableGarbageCollectionTask::class . ' misconfiguration: ' . $this->table . ' does not exist in configuration', 1308354399);
         }
         return true;
     }
@@ -72,29 +75,37 @@ class TableGarbageCollectionTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask
      */
     protected function handleTable($table, array $configuration)
     {
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
+        $queryBuilder->delete($table);
         if (!empty($configuration['expireField'])) {
             $field = $configuration['expireField'];
             $dateLimit = $GLOBALS['EXEC_TIME'];
             // If expire field value is 0, do not delete
             // Expire field = 0 means no expiration
-            $where = $field . ' <= \'' . $dateLimit . '\' AND ' . $field . ' > \'0\'';
+            $queryBuilder->where(
+                $queryBuilder->expr()->lte($field, $dateLimit),
+                $queryBuilder->expr()->gt($field, 0)
+            );
         } elseif (!empty($configuration['dateField'])) {
             if (!$this->allTables) {
                 $deleteTimestamp = strtotime('-' . $this->numberOfDays . 'days');
             } else {
                 if (!isset($configuration['expirePeriod'])) {
-                    throw new \RuntimeException(\TYPO3\CMS\Scheduler\Task\TableGarbageCollectionTask::class . ' misconfiguration: No expirePeriod defined for table ' . $table, 1308355095);
+                    throw new \RuntimeException(TableGarbageCollectionTask::class . ' misconfiguration: No expirePeriod defined for table ' . $table, 1308355095);
                 }
                 $deleteTimestamp = strtotime('-' . $configuration['expirePeriod'] . 'days');
             }
-            $where = $configuration['dateField'] . ' < ' . $deleteTimestamp;
+            $queryBuilder->where(
+                $queryBuilder->expr()->lt($configuration['dateField'], $deleteTimestamp)
+            );
         } else {
-            throw new \RuntimeException(\TYPO3\CMS\Scheduler\Task\TableGarbageCollectionTask::class . ' misconfiguration: Either expireField or dateField must be defined for table ' . $table, 1308355268);
+            throw new \RuntimeException(TableGarbageCollectionTask::class . ' misconfiguration: Either expireField or dateField must be defined for table ' . $table, 1308355268);
         }
-        $GLOBALS['TYPO3_DB']->exec_DELETEquery($table, $where);
-        $error = $GLOBALS['TYPO3_DB']->sql_error();
-        if ($error) {
-            throw new \RuntimeException(\TYPO3\CMS\Scheduler\Task\TableGarbageCollectionTask::class . ' failed for table ' . $this->table . ' with error: ' . $error, 1308255491);
+
+        try {
+            $queryBuilder->execute();
+        } catch (DBALException $e) {
+            throw new \RuntimeException(TableGarbageCollectionTask::class . ' failed for table ' . $this->table . ' with error: ' . $e->getMessage(), 1308255491);
         }
         return true;
     }