diff --git a/addons/event/models/event_mail.py b/addons/event/models/event_mail.py
index 2c45ee9cdfbe90b29bd5f29494e46fa3bec7c53d..ab8f15dfd0aaa38159d232bceb7cce1832c3c506 100644
--- a/addons/event/models/event_mail.py
+++ b/addons/event/models/event_mail.py
@@ -132,7 +132,7 @@ class EventMailScheduler(models.Model):
             else:
                 date, sign = scheduler.event_id.date_end, 1
 
-            scheduler.scheduled_date = date + _INTERVALS[scheduler.interval_unit](sign * scheduler.interval_nbr) if date else False
+            scheduler.scheduled_date = date.replace(microsecond=0) + _INTERVALS[scheduler.interval_unit](sign * scheduler.interval_nbr) if date else False
 
     @api.depends('interval_type', 'scheduled_date', 'mail_done')
     def _compute_mail_state(self):
@@ -320,6 +320,6 @@ class EventMailRegistration(models.Model):
     def _compute_scheduled_date(self):
         for mail in self:
             if mail.registration_id:
-                mail.scheduled_date = mail.registration_id.create_date + _INTERVALS[mail.scheduler_id.interval_unit](mail.scheduler_id.interval_nbr)
+                mail.scheduled_date = mail.registration_id.create_date.replace(microsecond=0) + _INTERVALS[mail.scheduler_id.interval_unit](mail.scheduler_id.interval_nbr)
             else:
                 mail.scheduled_date = False
diff --git a/addons/event/tests/test_event_mail_schedule.py b/addons/event/tests/test_event_mail_schedule.py
index a18610f8837798f42a42aff6870f49021eea1f7c..ee7b256942107c79275e373c55fe4ee172744de2 100644
--- a/addons/event/tests/test_event_mail_schedule.py
+++ b/addons/event/tests/test_event_mail_schedule.py
@@ -23,7 +23,10 @@ class TestMailSchedule(EventCase, MockEmail):
 
         # freeze some datetimes, and ensure more than 1D+1H before event starts
         # to ease time-based scheduler check
-        now = datetime(2021, 3, 20, 14, 30, 15)
+        # Since `now` is used to set the `create_date` of an event and create_date
+        # has often microseconds, we set it to ensure that the scheduler we still be
+        # launched if scheduled_date == create_date - microseconds
+        now = datetime(2021, 3, 20, 14, 30, 15, 123456)
         event_date_begin = datetime(2021, 3, 22, 8, 0, 0)
         event_date_end = datetime(2021, 3, 24, 18, 0, 0)
 
@@ -63,13 +66,13 @@ class TestMailSchedule(EventCase, MockEmail):
         # check subscription scheduler
         after_sub_scheduler = self.env['event.mail'].search([('event_id', '=', test_event.id), ('interval_type', '=', 'after_sub'), ('interval_unit', '=', 'now')])
         self.assertEqual(len(after_sub_scheduler), 1, 'event: wrong scheduler creation')
-        self.assertEqual(after_sub_scheduler.scheduled_date, test_event.create_date)
+        self.assertEqual(after_sub_scheduler.scheduled_date, test_event.create_date.replace(microsecond=0))
         self.assertFalse(after_sub_scheduler.mail_done)
         self.assertEqual(after_sub_scheduler.mail_state, 'running')
         self.assertEqual(after_sub_scheduler.mail_count_done, 0)
         after_sub_scheduler_2 = self.env['event.mail'].search([('event_id', '=', test_event.id), ('interval_type', '=', 'after_sub'), ('interval_unit', '=', 'hours')])
         self.assertEqual(len(after_sub_scheduler_2), 1, 'event: wrong scheduler creation')
-        self.assertEqual(after_sub_scheduler_2.scheduled_date, test_event.create_date + relativedelta(hours=1))
+        self.assertEqual(after_sub_scheduler_2.scheduled_date, test_event.create_date.replace(microsecond=0) + relativedelta(hours=1))
         self.assertFalse(after_sub_scheduler_2.mail_done)
         self.assertEqual(after_sub_scheduler_2.mail_state, 'running')
         self.assertEqual(after_sub_scheduler_2.mail_count_done, 0)
@@ -113,7 +116,7 @@ class TestMailSchedule(EventCase, MockEmail):
         # verify that subscription scheduler was auto-executed after each registration
         self.assertEqual(len(after_sub_scheduler.mail_registration_ids), 2, 'event: should have 2 scheduled communication (1 / registration)')
         for mail_registration in after_sub_scheduler.mail_registration_ids:
-            self.assertEqual(mail_registration.scheduled_date, now)
+            self.assertEqual(mail_registration.scheduled_date, now.replace(microsecond=0))
             self.assertTrue(mail_registration.mail_sent, 'event: registration mail should be sent at registration creation')
         self.assertTrue(after_sub_scheduler.mail_done, 'event: all subscription mails should have been sent')
         self.assertEqual(after_sub_scheduler.mail_state, 'running')
@@ -132,7 +135,7 @@ class TestMailSchedule(EventCase, MockEmail):
         # same for second scheduler: scheduled but not sent
         self.assertEqual(len(after_sub_scheduler_2.mail_registration_ids), 2, 'event: should have 2 scheduled communication (1 / registration)')
         for mail_registration in after_sub_scheduler_2.mail_registration_ids:
-            self.assertEqual(mail_registration.scheduled_date, now + relativedelta(hours=1))
+            self.assertEqual(mail_registration.scheduled_date, now.replace(microsecond=0) + relativedelta(hours=1))
             self.assertFalse(mail_registration.mail_sent, 'event: registration mail should be scheduled, not sent')
         self.assertFalse(after_sub_scheduler_2.mail_done, 'event: all subscription mails should be scheduled, not sent')
         self.assertEqual(after_sub_scheduler_2.mail_count_done, 0)
@@ -174,7 +177,7 @@ class TestMailSchedule(EventCase, MockEmail):
         self.assertEqual(event_prev_scheduler.mail_state, 'scheduled')
 
         # simulate cron running before scheduled date -> should not do anything
-        now_start = event_date_begin + relativedelta(hours=-25)
+        now_start = event_date_begin + relativedelta(hours=-25, microsecond=654321)
         with freeze_time(now_start), self.mock_mail_gateway():
             event_cron_id.method_direct_trigger()
 
@@ -184,7 +187,7 @@ class TestMailSchedule(EventCase, MockEmail):
         self.assertEqual(len(self._new_mails), 0)
 
         # execute cron to run schedulers after scheduled date
-        now_start = event_date_begin + relativedelta(hours=-23)
+        now_start = event_date_begin + relativedelta(hours=-23, microsecond=654321)
         with freeze_time(now_start), self.mock_mail_gateway():
             event_cron_id.method_direct_trigger()
 
@@ -232,14 +235,14 @@ class TestMailSchedule(EventCase, MockEmail):
         # verify that subscription scheduler was auto-executed after new registration confirmed
         self.assertEqual(len(after_sub_scheduler.mail_registration_ids), 3, 'event: should have 3 scheduled communication (1 / registration)')
         new_mail_reg = after_sub_scheduler.mail_registration_ids.filtered(lambda mail_reg: mail_reg.registration_id == reg3)
-        self.assertEqual(new_mail_reg.scheduled_date, now_start)
+        self.assertEqual(new_mail_reg.scheduled_date, now_start.replace(microsecond=0))
         self.assertTrue(new_mail_reg.mail_sent, 'event: registration mail should be sent at registration creation')
         self.assertTrue(after_sub_scheduler.mail_done, 'event: all subscription mails should have been sent')
         self.assertEqual(after_sub_scheduler.mail_count_done, 3)
         # verify that subscription scheduler was auto-executed after new registration confirmed
         self.assertEqual(len(after_sub_scheduler_2.mail_registration_ids), 3, 'event: should have 3 scheduled communication (1 / registration)')
         new_mail_reg = after_sub_scheduler_2.mail_registration_ids.filtered(lambda mail_reg: mail_reg.registration_id == reg3)
-        self.assertEqual(new_mail_reg.scheduled_date, now_start + relativedelta(hours=1))
+        self.assertEqual(new_mail_reg.scheduled_date, now_start.replace(microsecond=0) + relativedelta(hours=1))
         self.assertTrue(new_mail_reg.mail_sent, 'event: registration mail should be sent at registration creation')
         self.assertTrue(after_sub_scheduler_2.mail_done, 'event: all subscription mails should have been sent')
         self.assertEqual(after_sub_scheduler_2.mail_count_done, 3)
diff --git a/addons/event_sms/tests/test_sms_schedule.py b/addons/event_sms/tests/test_sms_schedule.py
index 8045c1ac65eefbcda9d1fed9d0557bb1b2ed3fdd..62b6985795b96973afd2bc9bf0a990c55918e0d9 100644
--- a/addons/event_sms/tests/test_sms_schedule.py
+++ b/addons/event_sms/tests/test_sms_schedule.py
@@ -61,7 +61,7 @@ class TestSMSSchedule(EventCase, SMSCase):
         # check subscription scheduler
         sub_scheduler = self.env['event.mail'].search([('event_id', '=', test_event.id), ('interval_type', '=', 'after_sub')])
         self.assertEqual(len(sub_scheduler), 1)
-        self.assertEqual(sub_scheduler.scheduled_date, test_event.create_date, 'event: incorrect scheduled date for checking controller')
+        self.assertEqual(sub_scheduler.scheduled_date, test_event.create_date.replace(microsecond=0), 'event: incorrect scheduled date for checking controller')
 
         # verify that subscription scheduler was auto-executed after each registration
         self.assertEqual(len(sub_scheduler.mail_registration_ids), 3)