diff --git a/src/logic/database/DatabaseCleaner.py b/src/logic/database/DatabaseCleaner.py
index 3cb0200ad68eceb3fac8982d49868c4375499ea0..97f88923b1816e6a8fb7a5b58fb0b196976a5c13 100644
--- a/src/logic/database/DatabaseCleaner.py
+++ b/src/logic/database/DatabaseCleaner.py
@@ -29,35 +29,41 @@ class DatabaseCleaner:
             for sensor in allSensors:
                 LOGGER.debug(f'Cleaning measurements for sensor "{sensor.name}" '
                              f'(id: {sensor.id}, device_id: {sensor.device_id})')
+                self._cleanup_measurements_for_sensor(sensor, db, policy, policyStart)
 
-                firstMeasurement = Crud.get_first_measurement_for_sensor(db=db, sensorId=sensor.id)
-                if firstMeasurement is None:
-                    continue
-
-                minDate = datetime.strptime(firstMeasurement.timestamp, Crud.DATE_FORMAT).date()
-
-                processedDate = policyStart
-                while processedDate > minDate:
-                    LOGGER.debug(f'Cleaning {processedDate.strftime("%Y-%m-%d")}...')
-                    measurementIds, idsToDelete = DatabaseCleaner._categorize_measurements_for_day(db,
-                                                                                                   date=processedDate,
-                                                                                                   policy=policy,
-                                                                                                   sensorId=sensor.id)
-
-                    processedDate = processedDate - timedelta(days=1)
+        LOGGER.info('Database cleanup done')
 
-                    if not idsToDelete:
-                        continue
+        # TODO: force backup?
 
-                    LOGGER.debug(
-                        f'Scheduled {len(idsToDelete)} measurements for deletion (keeping: {len(measurementIds)}, '
-                        f'max allowed: {policy.numberOfMeasurementsPerDay})')
+    @staticmethod
+    def _cleanup_measurements_for_sensor(sensor: Schemas.Sensor, db: Session,
+                                         policy: RetentionPolicy, policyStart: datetime.date):
+        firstMeasurement = Crud.get_first_measurement_for_sensor(db=db, sensorId=sensor.id)
+        if firstMeasurement is None:
+            return
 
-                    Crud.delete_multiple_measurements(db, idsToDelete)
+        minDate = datetime.strptime(firstMeasurement.timestamp, Crud.DATE_FORMAT).date()
 
-        LOGGER.info('Database cleanup done')
+        processedDate = policyStart
+        while processedDate > minDate:
+            LOGGER.debug(f'Cleaning {processedDate.strftime("%Y-%m-%d")}...')
+            DatabaseCleaner._cleanup_measurements_for_day(db, processedDate, policy, sensor.id)
+            processedDate = processedDate - timedelta(days=1)
 
-        # TODO: force backup?
+    @staticmethod
+    def _cleanup_measurements_for_day(db: Session, date: datetime.date,
+                                      policy: RetentionPolicy, sensor_id: int):
+        measurementIds, idsToDelete = DatabaseCleaner._categorize_measurements_for_day(db,
+                                                                                       date=date,
+                                                                                       policy=policy,
+                                                                                       sensorId=sensor_id)
+
+        if not idsToDelete:
+            return
+
+        LOGGER.debug(f'Scheduled {len(idsToDelete)} measurements for deletion '
+                     f'(keeping: {len(measurementIds)}, max allowed: {policy.numberOfMeasurementsPerDay})')
+        Crud.delete_multiple_measurements(db, idsToDelete)
 
     @staticmethod
     def _categorize_measurements_for_day(db: Session, date: datetime.date,