ProgrammingError:无法将类型双精度转换为没有时区的时间

Posted

技术标签:

【中文标题】ProgrammingError:无法将类型双精度转换为没有时区的时间【英文标题】:ProgrammingError: cannot cast type double precision to time without time zone 【发布时间】:2017-02-08 21:57:59 【问题描述】:

我有一个具有以下型号的 django 应用程序:

class Event(models.Model):
    # id = models.IntegerField(primary_key=True)
    event_type = models.ForeignKey(
        EventType,
        on_delete=models.DO_NOTHING,
        # we don't want to delete anything in the StatusType table.
        blank=True,
        null=True,
    )
    reason_code = models.IntegerField(default=0)
    elapsed_time = models.IntegerField(default=0)
    event_at = models.DateTimeField("Event Time", blank=True, auto_now_add=True)
    object_id = models.ForeignKey(Machine, on_delete=models.DO_NOTHING, )
    count = models.BigIntegerField(blank=True, null=True)
    position = models.IntegerField(blank=True, null=True)
    rfid_tag = models.ForeignKey(Employee, blank=True, null=True, on_delete=models.DO_NOTHING,
                                 verbose_name='User Name')
    hidden = models.BooleanField(default=False)  # for hiding from lists

    # def __str__(self):              # __unicode__ on Python 2
    #     return self.event_type

    class Meta:
        verbose_name = 'event'
        verbose_name_plural = 'Events'

    def __str__(self):
        return str(self.id)

在尝试运行简单迁移时,我不断收到此错误:

File "/home/icar/E-Django/venv/local/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/epicar/E-Django/venv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: cannot cast type double precision to time without time zone

我遇到的问题是,我不明白为什么它试图将双精度转换为没有时区的时间。我不希望它。我不太确定还能尝试什么。我尝试过以下操作:

SELECT CAST(elapsed_time as double precision) FROM event;

我还尝试将 elapsed_time 字段更改为整数并得到相同的错误(引用整数而不是双精度)。所以我知道这是那个特殊的领域。

我已删除所有迁移并尝试重新开始。那没有用。

有什么想法吗?

更新:来自 pgadmin 的已用字段的属性:

【问题讨论】:

【参考方案1】:

如果我理解正确,你会寻找这个:

SELECT extract(epoch FROM now());

【讨论】:

这到底是做什么的? 从纪元 (1970-01-01 00:00:00) 或间隔中获取秒数。这只是将时间戳或间隔设置为双精度的一种方法 hmmm...进入该字段的数据在技术上是经过的秒数。这会导致它抛出错误吗?我们没有提取实际的时间戳。我们不想。我们想显示经过的秒数,以便我可以对其进行计算……以简单数字(不是时间字段)的形式。我知道你可以对时间字段进行计算。 我不使用 django,但看起来比现在您的表 event 具有字段 elapsed_time 作为时间戳。你能在 psql 或 pgadmin 中查找表描述吗? 没问题 - 找到原因非常有趣。自行查找时有趣的两倍【参考方案2】:

想通了。 :) 它最终在 Django 方面:

字段类型变化:

elapsed_time = models.TimeField(blank=True, auto_now_add=True)

这解决了 Django 和 Postgres 字段类型之间的冲突。

System check identified no issues (0 silenced).
February 09, 2017 - 16:34:59
Django version 1.9, using settings 'E-Django.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

一切正常,现在正在运行。

【讨论】:

以上是关于ProgrammingError:无法将类型双精度转换为没有时区的时间的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy(psycopg2.ProgrammingError)无法适应类型'dict'

将变体转换为双精度时出错 [ Delphi XE + IBObjects 4.9.12 ]

psycopg2.ProgrammingError:无法在 odoo 14 中调整类型“NewId”

比较一个 32 位浮点数和一个 32 位整数而不强制转换为双精度,当任何一个值都可能太大而无法完全适合另一种类型时

无法将双精度的 NSArray 保存到文件 ios

短整数上的 G++ abs() 似乎将其变成了双精度数?