При получении продолжительности работы сотрудника от момента присоединения до date.today() в запросе Django, используя объекты F() и DurationField(), я получаю отрицательный результат

Я пишу запрос для получения продолжительности между двумя полями даты. Одно - из модели django (dateField), а другое - просто datetime.date.today(). Я использовал F() объекты для значения столбца модели, чтобы избежать использования памяти.

    def duration(self):
        emp_duration = Employee.objects.values('empName', 'empJoining').annotate(
            duration=(datetime.date.today() - F('empJoining'))
        )
        return HttpResponse(emp_duration)

Выход:

{'empName': 'xyz', 'empJoining': datetime.date(2003, 1, 21), 'duration': -20028098.0}
{'empName': 'Amna', 'empJoining': datetime.date(2022, 8, 9), 'duration': -20218786.0}
{'empName': 'abc', 'empJoining': datetime.date(2022, 7, 17), 'duration': -20218694.0}

Посмотрите на поле длительности. Я не понимаю, почему оно отрицательное.

Тогда я использовал ExpressionWrapper с выходным полем как DurationField(). Поскольку объектам F() необходим ExpressionWrapper для определения выходных полей.

    def duration(self):
        emp_duration = Employee.objects.values('empName', 'empJoining').annotate(
            duration=ExpressionWrapper(
                (datetime.date.today() - F('empJoining')), output_field=DurationField()
            )
        )
        return HttpResponse(emp_duration)

Выход:

{'empName': 'xyz', 'empJoining': datetime.date(2003, 1, 21), 'duration': datetime.timedelta(days=-1, seconds=86379, microseconds=971902)}
{'empName': 'Amna', 'empJoining': datetime.date(2022, 8, 9), 'duration': datetime.timedelta(days=-1, seconds=86379, microseconds=781214)}
{'empName': 'abc', 'empJoining': datetime.date(2022, 7, 17), 'duration': datetime.timedelta(days=-1, seconds=86379, microseconds=781306)}

Разница в днях одинакова в каждом ряду и не является правильным ответом. Вычитание не является правильным. В чем проблема, если кто-то может дать мне лучший подход или указать, что я здесь упускаю, это будет одолжением. Спасибо

Вернуться на верх