diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index bcf881480e89f4fa3367223618009641010b2763..0171b77787c4731efd4a1d23d8c1cb62cf42f2a2 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -14,6 +14,7 @@ Fixed
 
 * It wasn't possible to run data checks due to broken color data checks.
 * Recurrence information for calendar events weren't removed on deletion.
+* Full day events didn't work in calendar.
 * [Dev] AddressInputType missed country field.
 
 `4.0`_ - 2025-03-29
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index b0cbc0c09af83511c1bd10cba2f297897ae16046..bb6e29a59e49b21f3477b38acb3749143f99c30b 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -1760,9 +1760,9 @@ class CalendarEvent(
     @property
     def real_datetime_start(self) -> datetime:
         """Get real start datetime of this event."""
-        if hasattr(self, "odatetime"):
+        if hasattr(self, "odatetime") and self.odatetime:
             return self.get_in_timezone(self.odatetime)
-        elif hasattr(self, "odate"):
+        elif hasattr(self, "odate") and self.odate:
             return self.odate.date()
         elif self.datetime_start:
             return self.get_in_timezone(self.datetime_start)
@@ -1771,11 +1771,11 @@ class CalendarEvent(
     @property
     def real_datetime_end(self) -> datetime:
         """Get real end datetime of this event."""
-        if hasattr(self, "odatetime"):
+        if hasattr(self, "odatetime") and self.odatetime:
             return self.get_in_timezone(self.odatetime + self.duration)
         elif self.datetime_end:
             return self.get_in_timezone(self.datetime_end)
-        elif hasattr(self, "odate"):
+        elif hasattr(self, "odate") and self.odate:
             # RFC 5545 states that the end date is not inclusive
             return (self.odate + self.duration + timedelta(days=1)).date()
         return self.date_end + timedelta(days=1)