Django:Trunc datetime 结果 none
Django: Trunc datetime results in none
我有以下型号:
class Statistic(models.Model):
meter = models.ForeignKey(Meter, on_delete=models.CASCADE, db_index=True)
timestamp_start = models.DateTimeField(db_index=True)
timestamp_end = models.DateTimeField(db_index=True)
usage_start = models.DecimalField(max_digits=10, decimal_places=3)
usage_end = models.DecimalField(max_digits=10, decimal_places=3)
return_start = models.DecimalField(max_digits=10, decimal_places=3)
return_end = models.DecimalField(max_digits=10, decimal_places=3)
我的 sqllite 数据库 timestamp_start 的第一条记录中有以下值
2016-12-22T06:15:30.420+02:00
当我运行以下查询时:
statistics = Statistic.objects.filter(id=1)
.annotate(timestamp=Trunc('timestamp_start','day', output_field=DateTimeField()))
.values('timestamp')
.annotate(usage_start = Min('usage_start'))
时间戳结果为 None
QuerySet [{'usage_start': Decimal('136.972'), 'timestamp': None}]
当我附加调试器并检查我的统计数据的第一条记录时 table 像这样
Statistics.objects.all()[0].timestamp_start
它returns:
datetime.datetime(2016, 12, 22, 6, 0)
在遇到这个问题之前我遇到了这个异常:
Database returned an invalid datetime value. Are time zone definitions for your database and pytz installed?
我确实安装了 pytz。但不知道如何解决这个问题。值不正确?无论如何,最后我将 settings.py 中的 use_tz 设置为 false。异常消失了,但 t运行c returns none 现在。这是导致问题的原因吗?
p.s.: 我的环境Python 3、Django,Sql精简版数据库,windows
您可能还没有将时区数据加载到 mysql。 TruncDate 在后台使用 CONVERT_TZ
函数,如果没有可用的时区数据,则使用 returns NULL
。您可以通过评估以下内容来检查 SQL 查询正在使用什么:
str(statistics.query)
Windows 加载时区数据的说明可以在这里找到:
- https://dev.mysql.com/downloads/timezones.html
- https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html#time-zone-installation(确保向下滚动讨论 Windows 的部分)
我 运行 在 Linux 上解决了这个问题,并按照另一个 Whosebug post:
中的指示解决了它
- convert_tz returns null
我有以下型号:
class Statistic(models.Model):
meter = models.ForeignKey(Meter, on_delete=models.CASCADE, db_index=True)
timestamp_start = models.DateTimeField(db_index=True)
timestamp_end = models.DateTimeField(db_index=True)
usage_start = models.DecimalField(max_digits=10, decimal_places=3)
usage_end = models.DecimalField(max_digits=10, decimal_places=3)
return_start = models.DecimalField(max_digits=10, decimal_places=3)
return_end = models.DecimalField(max_digits=10, decimal_places=3)
我的 sqllite 数据库 timestamp_start 的第一条记录中有以下值
2016-12-22T06:15:30.420+02:00
当我运行以下查询时:
statistics = Statistic.objects.filter(id=1)
.annotate(timestamp=Trunc('timestamp_start','day', output_field=DateTimeField()))
.values('timestamp')
.annotate(usage_start = Min('usage_start'))
时间戳结果为 None
QuerySet [{'usage_start': Decimal('136.972'), 'timestamp': None}]
当我附加调试器并检查我的统计数据的第一条记录时 table 像这样
Statistics.objects.all()[0].timestamp_start
它returns:
datetime.datetime(2016, 12, 22, 6, 0)
在遇到这个问题之前我遇到了这个异常:
Database returned an invalid datetime value. Are time zone definitions for your database and pytz installed?
我确实安装了 pytz。但不知道如何解决这个问题。值不正确?无论如何,最后我将 settings.py 中的 use_tz 设置为 false。异常消失了,但 t运行c returns none 现在。这是导致问题的原因吗?
p.s.: 我的环境Python 3、Django,Sql精简版数据库,windows
您可能还没有将时区数据加载到 mysql。 TruncDate 在后台使用 CONVERT_TZ
函数,如果没有可用的时区数据,则使用 returns NULL
。您可以通过评估以下内容来检查 SQL 查询正在使用什么:
str(statistics.query)
Windows 加载时区数据的说明可以在这里找到:
- https://dev.mysql.com/downloads/timezones.html
- https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html#time-zone-installation(确保向下滚动讨论 Windows 的部分)
我 运行 在 Linux 上解决了这个问题,并按照另一个 Whosebug post:
中的指示解决了它- convert_tz returns null