【问题标题】:PostgreSQL: 42883 Operator does not exist: timestamp without time zone = textPostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本
【发布时间】: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'

出于性能原因,我真的不想将我的数据库列类型转换为文本。

【问题讨论】:

    标签: c# postgresql npgsql petapoco


    【解决方案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 作为带参数的 SSRS 报告的数据源时,这对我帮助很大。谢谢!
      猜你喜欢
      • 2020-04-14
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2014-02-12
      相关资源
      最近更新 更多