【问题标题】:TruncDate timezone parameter is not working in DjangoTruncDate 时区参数在 Django 中不起作用
【发布时间】:2017-10-25 11:29:33
【问题描述】:

无法在 Trunc 函数中更改 TImezone。它总是从 settings.py 获取时区

import pytz
ind = pytz.timezone('Asia/Calcutta')   

查询:

queryset = Order.objects.annotate(date=TruncDate('created_at', tzinfo=ind)).values('date')

在检查queryset.query的sql查询时

SELECT DATE(CONVERT_TZ(`nm_order`.`created_at`, 'UTC', UTC)) AS `date` FROM `nm_order`

参考:Trunc in Django


但是对于Extract,它开始工作了

ORM:

queryset = Order.objects.annotate(date=ExtractDay('created_at',tzinfo=ind)).values('date')

查询:

SELECT EXTRACT(DAY FROM CONVERT_TZ(`nm_order`.`created_at`, 'UTC', Asia/Calcutta)) AS `date` FROM `nm_order`

我是否错过了Trunc 中的某些内容?

我的settings.py中的时区设置

IME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    您需要使用TruncDay() 而不是TruncDate。在文档该部分下方的使用示例中,您将看到两者之间的区别。

    TruncDate 不采用时区选项 - 它使用当前时区并为您提供该时区的日期。

    我认为两者之间的区别在于TruncDate 返回一个DateField,根据定义它不能感知时区。另一方面,TruncDay 返回一个 DateTimeField(时间部分设置为 00:00:00),它可以感知时区。

    【讨论】:

    • 是的。非常感谢。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      检查后 TruncDate 类看起来没有时区选项

      class TruncDate(TruncBase):
          kind = 'date'
          lookup_name = 'date'
      
          @cached_property
          def output_field(self):
              return DateField()
      
          def as_sql(self, compiler, connection):
              # Cast to date rather than truncate to date.
              lhs, lhs_params = compiler.compile(self.lhs)
              tzname = timezone.get_current_timezone_name() if settings.USE_TZ else None
              sql, tz_params = connection.ops.datetime_cast_date_sql(lhs, tzname)
              lhs_params.extend(tz_params)
              return sql, lhs_params
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 2021-03-31
        • 2015-07-24
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多