diff --git a/program/services.py b/program/services.py
index 23497ed65fdfa6b9834ef7cb91c291c0820af385..86b9f0cd0434010c75b9281df0290856963b261c 100644
--- a/program/services.py
+++ b/program/services.py
@@ -720,13 +720,23 @@ def generate_program_entries(
         )
 
     def create_timeslot_entry(timeslot: TimeSlot):
-        return create_entry(timeslot.start, timeslot.end, timeslot.schedule.show, timeslot)
+        return create_entry(
+            # Ensure the program entry never starts before the requested start
+            # and never ends after the requested end.
+            max(timeslot.start, start),
+            min(timeslot.end, end),
+            timeslot.schedule.show,
+            timeslot,
+        )
 
     if start is None:
         start = timezone.now()
     if end is None:
         end = start + timedelta(days=1)
-    queryset = queryset.filter(start__gte=start, start__lt=end)
+    # Find all timeslots that
+    #   * have started before the specified start value but end after it
+    #   * or end after the specified end value but start before it
+    queryset = queryset.filter(end__gt=start, start__lt=end).order_by("start")
 
     if not include_virtual:
         yield from (create_timeslot_entry(timeslot) for timeslot in queryset)
@@ -744,5 +754,5 @@ def generate_program_entries(
             yield create_entry(entry_start, timeslot.start, fallback_show)
         yield create_timeslot_entry(timeslot)
         entry_start = timeslot.end
-    if entry_start != end:
+    if entry_start < end:
         yield create_entry(entry_start, end, fallback_show)