【问题标题】:Django MySQL group by day with timezone带时区的 Django MySQL 分组
【发布时间】:2015-01-26 17:54:02
【问题描述】:

假设我有一个销售模型:

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。

【问题讨论】:

    标签: python mysql django django-orm


    【解决方案1】:

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

    要使用命名时区,例如 METEurope/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')
    )
    

    【讨论】:

    • 太棒了,坦克!附带说明一下,convert_tz 还接受 tz 偏移量,from_tz="+00:00"to_tz="-06:00"
    猜你喜欢
    • 2019-01-10
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多