PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本
PostgreSQL: 42883 Operator does not exist: timestamp without time zone = text
我正在使用 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: operator does not exist: timestamp
without time zone = text
我知道错误消息是说我正在尝试将时间戳(日期)与文本进行比较,但是对我来说,比较它们是完全有效的,因为我正在 期待要构建的以下 SQL 语句:
SELECT * FROM category WHERE date_created = '2017-02-03 15:00:00'
出于性能原因,我真的不想将我的数据库列强制转换为文本。
您需要将值转换为时间戳:
var sql = new Sql("WHERE date_created = @0::timestamp", dateCreated.ToString("yyyy-MM-dd HH:00:00"));
正如@roman-tkachuk 回答的那样,您可以告诉 PostgreSQL 将您的字符串转换为时间戳。
或者更好的是,您可以直接将时间戳发送到 PostgreSQL,而不是发送时间戳的字符串表示并强制转换。为此,只需直接发送 dateCreated
,无需 ToString()
.
您需要将文本显式转换为时间戳。
尝试使用:
TO_TIMESTAMP(date_string,'YYYY-MM-DD')
我正在使用 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: operator does not exist: timestamp without time zone = text
我知道错误消息是说我正在尝试将时间戳(日期)与文本进行比较,但是对我来说,比较它们是完全有效的,因为我正在 期待要构建的以下 SQL 语句:
SELECT * FROM category WHERE date_created = '2017-02-03 15:00:00'
出于性能原因,我真的不想将我的数据库列强制转换为文本。
您需要将值转换为时间戳:
var sql = new Sql("WHERE date_created = @0::timestamp", dateCreated.ToString("yyyy-MM-dd HH:00:00"));
正如@roman-tkachuk 回答的那样,您可以告诉 PostgreSQL 将您的字符串转换为时间戳。
或者更好的是,您可以直接将时间戳发送到 PostgreSQL,而不是发送时间戳的字符串表示并强制转换。为此,只需直接发送 dateCreated
,无需 ToString()
.
您需要将文本显式转换为时间戳。
尝试使用:
TO_TIMESTAMP(date_string,'YYYY-MM-DD')