运算符不存在:没有时区的时间戳 ~~* 未知的 ruby​​ 代码

Posted

技术标签:

【中文标题】运算符不存在:没有时区的时间戳 ~~* 未知的 ruby​​ 代码【英文标题】:operator does not exist: timestamp without time zone ~~* unknown ruby code 【发布时间】:2019-06-14 17:05:56 【问题描述】:

我在搜索时尝试查询数据库中的用户。但是我收到一个特定错误,即“运营商不存在:没有时区的时间戳 ~~* 未知”

在我的数据库中,data_of_birth 的记录以下面的格式保存。现在确定我错过了什么。代码如下

field == "dob"
            selected_date = Date.strptime(query, '%Y-%m-%d')
            items = Patient.joins(role: :user).where('users.date_of_birth ILIKE :search', search: "%#selected_date%")

出生日期在数据库中的保存方式

 date_of_birth: "1997-03-29 00:00:00"

【问题讨论】:

ILIKE 在时间戳上没有多大意义。你可能只想要= 您的date_of_birth 列不应该是date 而不是timestamp 吗?然后你可以做一个简单的相等测试。 它有一个日期时间。我的专栏在数据库 't.datetime "date_of_birth", null: false' 中查找此内容 应该只是日期而不是日期时间吗? @muistooshort 是的,t.date 会更合适。迁移中的t.datetime 在 PostgreSQL 中以timestamp 结尾,对于术语更改感到抱歉。但是你仍然不能在 PostgreSQL 中使用 LIKE,你可以使用=。 SQLite 将允许您使用 LIKE,因为它没有真正的日期或时间类型,它使用 ISO-8601 格式将日期和时间存储在文本值中;我不知道这部分是否适用。 【参考方案1】:

时间戳在数据库中存储为数字,而不是字符串,因此使用字符串比较(例如ILIKE)将不起作用。

听起来您正在尝试将时间戳与日期匹配。您可以简单地将时间戳转换为日期。比如:

WHERE users.date_of_birth::date = '2019-06-14'

根据您的代码,这似乎转换为以下内容。

field == "dob"
        selected_date = Date.strptime(query, '%Y-%m-%d')
        items = Patient.joins(role: :user).where('users.date_of_birth::date = :search', search: "%#selected_date%")

我不熟悉您正在使用的库,但看起来“::date”部分可能会遇到占位符功能。您可能需要对其进行修改才能使其正常工作。

【讨论】:

以上是关于运算符不存在:没有时区的时间戳 ~~* 未知的 ruby​​ 代码的主要内容,如果未能解决你的问题,请参考以下文章

修复错误:“运算符不存在:没有时区的时间戳>整数”错误

PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本

错误:运算符不存在:没有时区的时间戳>整数)

带有时区的时间戳,使用 django ORM 未知

运算符不存在:带有时区的 tstzrange && 时间戳

收到错误“功能周(没有时区的时间戳)不存在”