While getting employee duration from joining to date.today() in Django query using F() objects and DurationField(), I am getting negative output

163 views Asked by At

I am writing a query to get duration between 2 date fields. One is from django model (dateField) and other is simply datetime.date.today(). I have used F() objects for model column value to avoid memory usage.

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

Output:

{'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}

Have a look at duration field. I don't understand why its in negative.

Then I used ExpressionWrapper with outputfield as DurationField(). Since F() objects needs ExpressionWrapper to define outputFields.

    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)

Output:

{'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)}

Days difference is same in each row and not the right answer though. The substraction is not correct. What is the issue, if someone can give me better approach or point out what am I missing here, that will be a favor.

0

There are 0 answers