PostgreSQL: 42883运算符不存在:timestamp without time zone = text

12

我正在使用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: 操作符不存在:timestamp without time zone = text

我理解这个错误信息是在说我试图比较一个时间戳(日期)和一个文本,但对于我来说,这是完全有效的,因为我“期望”将构建以下SQL语句:

SELECT * FROM category WHERE date_created = '2017-02-03 15:00:00'

出于性能考虑,我不太想将我的数据库列转换为文本类型。

3个回答

12
您需要将值转换为时间戳:
var sql = new Sql("WHERE date_created = @0::timestamp", dateCreated.ToString("yyyy-MM-dd HH:00:00"));

5

你需要将文本明确地转换为时间戳。

尝试使用:

TO_TIMESTAMP(date_string,'YYYY-MM-DD')

这个对我在使用Postgres作为带参数的SSRS报表数据源时非常有帮助。谢谢! - Dag Baardsen

1
如@roman-tkachuk所回答的那样,您可以告诉PostgreSQL将您的字符串转换为时间戳。
或者更好的是,您可以直接向PostgreSQL发送时间戳,而不是发送时间戳的字符串表示形式并进行转换。要做到这一点,只需直接发送dateCreated,无需ToString()

1
我使用 ToString() 格式化日期时间的原因是因为我需要忽略分钟和秒数。 - AndreFeijo
你可以通过在C#中创建一个DateTime对象并将分钟和秒数归零来实现同样的效果。这实际上就是你所做的事情,只不过是通过字符串完成的,这种方式不够“紧凑”。当然这并不是非常重要,只是提一下。 - Shay Rojansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接