python - Django:截断日期时间没有结果

标签 python django sqlite datetime truncate

我有以下模型:

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'))

时间戳结果为“无”

QuerySet [{'usage_start': Decimal('136.972'), 'timestamp': None}]

当我连接调试器并检查统计表的第一条记录时,如下所示

Statistics.objects.all()[0].timestamp_start

它返回:

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。异常消失了,但 trunc 现在不返回任何内容。这是导致问题的原因吗?

p.s.:我的环境Python 3、Django、Sql lite数据库、windows

最佳答案

您可能还没有将时区数据加载到 mysql 中。 TruncDate 在底层使用 CONVERT_TZ 函数,如果没有可用的时区数据,该函数将返回 NULL。您可以通过评估以下内容来检查查询正在使用什么 SQL:

str(statistics.query)

可以在此处找到加载时区数据的 Windows 说明:

我在 Linux 上遇到了这个问题,并按照另一篇 StackOverflow 帖子中的说明解决了它:

关于python - Django:截断日期时间没有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43746385/

相关文章:

python - 我怎样才能让 send() 阻止 UDP?

python - 如何从一个方法中调用另一个方法?

javascript - onclick getElementsByClassName 并返回数据

django - 是否可以显示 django celery 任务的进度条?

android - 钛安装数据库

python - peewee:Python int 太大而无法转换为 SQLite INTEGER

Python:为什么我不能将元组解包到字典中?

python - numpy.sum 性能取决于轴

python - 收到意外的关键字参数 'pk'

python - HDF5 - 并发、压缩和 I/O 性能