【问题标题】:Django parse date to dd-mm-yyyy in QuerySetDjango 将日期解析为 QuerySet 中的 dd-mm-yyyy
【发布时间】:2020-07-29 11:32:59
【问题描述】:

我有以下 QuerySet 来检索 SQL Server 数据库中记录计数的所有日期。

    def get_amount_per_day(self):
        return self.extra(select={'time': 'CONVERT(DATE, starttime)'}).values(
            'time').annotate(amount=Count('starttime')).order_by('time')

输出是:

{
        "time": "2019-03-07T00:00:00",
        "amount": 216
    },
    {
        "time": "2019-03-07T01:00:00",
        "amount": 178
    }
}

但我想将日期解析为07-03-2019,有人知道我该如何实现吗?

我尝试将日期转换为varchar,但随后order_by 无法正常工作。它必须是DATE 类型。

【问题讨论】:

    标签: sql-server django django-rest-framework django-queryset


    【解决方案1】:

    您可以使用Cast。例如:

    from django.db.models.functions import Cast
    from django.db.models import DateField
    
    YourModel.objects.annotate(start_date=Cast('starttime', DateField()))
    

    更新

    你可以这样尝试使用database functions:

    from django.db.models.functions import ExtractDay, ExtractMonth, ExtractYear
    
    YourModel.objects.annotate(
        year=ExtractYear('starttime'),
        month=ExtractMonth('starttime'),
        day=ExtractDay('starttime')
    ).annotate(start_date=F('date')+'-'+F('month')+'-'+F('year')).values('start_date')
    

    未经测试的代码

    Based on this answer,你可以这样试试:

    YourModel.objects.annotate(start_date=ExpressionWrapper(
            Func(F('starttime'), Value('%d-%m-%Y'), function='DATE_FORMAT'), output_field=CharField()
        ))
    

    【讨论】:

    • 问题不在于将其转换为DateField,它已经是一个DateField。问题是它没有返回想要的格式。
    • 未经测试的代码不适用于 SQL Server,DATE_FORMAT 不是函数。另一个 posibiltiy 返回 2024 而不是 2-3-2019。它将所有数字加到 2024 年,但我不知道为什么
    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2016-04-04
    相关资源
    最近更新 更多