运算符不存在:没有时区的时间戳 ~~* 未知的 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 代码的主要内容,如果未能解决你的问题,请参考以下文章