PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本
Posted
技术标签:
【中文标题】PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本【英文标题】:PostgreSQL: 42883 Operator does not exist: timestamp without time zone = text 【发布时间】:2017-06-21 09:26:41 【问题描述】:我正在使用 Npgsql 3.0.3.0 和 PetaPoco 最新版本。
当我运行这个命令时:
var dateCreated = DateTime.Now; // just an example
var sql = new Sql("WHERE date_created = @0", dateCreated.ToString("yyyy-MM-dd HH:00:00"));
var category = db.SingleOrDefault<Category>(sql);
我收到以下错误:
Npgsql.NpgsqlException 42883:运算符不存在:时间戳 没有时区=文本
我知道错误消息是说我正在尝试将时间戳(日期)与文本进行比较,但是对我来说,比较它们是完全有效的,因为我期望下面的 SQL 语句建造:
SELECT * FROM category WHERE date_created = '2017-02-03 15:00:00'
出于性能原因,我真的不想将我的数据库列类型转换为文本。
【问题讨论】:
【参考方案1】:您需要将值转换为时间戳:
var sql = new Sql("WHERE date_created = @0::timestamp", dateCreated.ToString("yyyy-MM-dd HH:00:00"));
【讨论】:
【参考方案2】:正如@roman-tkachuk 回答的那样,您可以告诉 PostgreSQL 将您的字符串转换为时间戳。
或者更好的是,您可以直接向 PostgreSQL 发送时间戳,而不是发送时间戳的字符串表示形式并进行转换。为此,只需直接发送dateCreated
,无需ToString()
。
【讨论】:
我使用ToString()
格式化日期时间的原因是我需要忽略分钟和秒。
您也可以通过在 C# 中创建一个 DateTime 并将分钟和秒归零来做到这一点。这实际上就是你正在做的事情,只是通过一个不太“紧”的字符串。绝对不是很重要 - 只是提一下。【参考方案3】:
您需要将文本显式类型转换为时间戳。
尝试使用:
TO_TIMESTAMP(date_string,'YYYY-MM-DD')
【讨论】:
当我使用 Postgres 作为带参数的 s-s-rS 报告的数据源时,这对我帮助很大。谢谢!以上是关于PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本的主要内容,如果未能解决你的问题,请参考以下文章
在 PostgreSQL 中使用自定义类型并将它们用作函数中的参数
PostgreSQL:错误:运算符不存在:整数 = 字符变化
PostgresException: 42883: function ifnull(integer, integer) does not exist