Django MySQL按天分组

时间:2014-11-28 05:27:57

标签: python mysql django django-orm

假设我有销售模式:

class Sale(models.Model):
    total = models.DecimalField(max_digits=8, decimal_places=2, default=0)
    sale_date = models.DateTimeField(auto_now_add=True)

现在,每次销售sale_date都会以UTC格式保存其值,因此如果我尝试按天分组并汇总所有销售额:

report = Sale.objects.extra({'day':"date(sale_date)"}).values('day').annotate(day_total=Sum('total'))

我错了,因为我希望每天都在不同的时区(UTC-6)。

有没有办法在特定的tiemezone中获得正确的金额?我正在使用MySQL。

1 个答案:

答案 0 :(得分:1)

啊,这是一个很好的挑战。我能够从PostGres测试,我可以确认它正在工作。 MySQL代码应该非常接近。但是,CONVERT_TZ documentation上有一条说明:

  

要使用指定的时区,例如 MET Europe/Moscow ,必须正确设置时区表。有关说明,请参阅Section 10.6, “MySQL Server Time Zone Support”

MySQL (使用CONVERT_TZ(dt, from_tz, to_tz)

from_tz = 'UTC'
to_tz = 'Australia/ACT'
report = Sale.objects.extra(
    {
        'day': "date(CONVERT_TZ(sale_date, '{from_tz}', '{to_tz}'))".format(
            from_tz=from_tz,
            to_tz=to_tz
         )
    }
).values(
    'day'
).annotate(
    day_total=Sum('total')
)

PostGres:(使用AT TIME ZONE

time_zone = 'Australia/ACT'
report = Sale.objects.extra(
    {'day': "date(sale_date) AT TIME ZONE '{0}'".format(time_zone)}
).values(
    'day'
).annotate(
    day_total=Sum('total')
)
相关问题