I'm trying to filter a queryset with the same DateTime fields:
objects = Obj.objects.filter(start_date_time=F('end_date_time'))
objects
<QuerySet []>
models.py:
start_date_time = models.DateTimeField(default=now, blank=True)
end_date_time = models.DateTimeField(default=now, blank=True)
If I remove microseconds, then the fields are equal:
obj = Obj.objects.filter(id='id').first()
obj.start_date_time
datetime.datetime(2023, 3, 10, 9, 24, 29, 326238, tzinfo=<UTC>)
obj.end_date_time
datetime.datetime(2023, 3, 10, 9, 24, 29, 326241, tzinfo=<UTC>)
obj.start_date_time == obj.end_date_time
False
obj.start_date_time.replace(microsecond=0) == obj.end_date_time.replace(microsecond=0)
True
How to make a request to the database correctly?
You can use Trunc
function to truncate the milisecond information and filter like this:
objects = Obj.objects.annotate(truc_start_date_time=Trunc('start_datetime', 'second', output_field=DateTimeField()), trunc_end_date_time==Trunc('endt_datetime', 'second', output_field=DateTimeField())).filter(trunc_start_date=F('trunc_end_date'))
Another alternative is to filter using all segments of the date time object (ie date, hour, minute, second)
objects = Obj.objects.filter(start_date_time_day__date = F('end_datetime__date'), start_date_time_day__hour = F('end_datetime__hour'), start_date_time_day__minute = F('end_datetime__minute'), start_date_time_day__second = F('end_datetime__second'))