timerange.py 1.1 KB

12345678910111213141516171819202122232425262728293031
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from sqlalchemy import func, select
  4. from flexmeasures.data import db
  5. from flexmeasures.utils import time_utils
  6. def get_timerange(sensor_ids: list[int]) -> tuple[datetime, datetime]:
  7. """Get the start and end of the least recent and most recent event, respectively.
  8. In case of no data, defaults to (now, now).
  9. """
  10. from flexmeasures.data.models.time_series import Sensor, TimedBelief
  11. least_recent_event_start_and_most_recent_event_end = db.session.execute(
  12. select(
  13. func.min(TimedBelief.event_start),
  14. func.max(TimedBelief.event_start + Sensor.event_resolution),
  15. )
  16. .select_from(TimedBelief)
  17. .join(Sensor, TimedBelief.sensor_id == Sensor.id)
  18. .filter(TimedBelief.sensor_id.in_(sensor_ids))
  19. ).one_or_none()
  20. if least_recent_event_start_and_most_recent_event_end == (None, None):
  21. # return now in case there is no data for any of the sensors
  22. now = time_utils.server_now()
  23. return now, now
  24. return least_recent_event_start_and_most_recent_event_end