web-dev-qa-db-ja.com

PostgreSQL:42883演算子が存在しません:タイムゾーンのないタイムスタンプ=テキスト

Npgsql3.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'

パフォーマンス上の理由から、データベースの列をテキストにタイプキャストしたくありません。

5
AndreFeijo

値をタイムスタンプにキャストする必要があります。

var sql = new Sql("WHERE date_created = @0::timestamp", dateCreated.ToString("yyyy-MM-dd HH:00:00"));
4
Roman Tkachuk

@ roman-tkachukが答えたように、文字列をタイムスタンプにキャストするようにPostgreSQLに指示できます。

さらに良いことに、タイムスタンプの文字列表現を送信してキャストさせるのではなく、タイムスタンプをPostgreSQLに直接送信することもできます。これを行うには、ToString()を使用せずにdateCreatedを直接送信します。

0
Shay Rojansky

タイムスタンプにタイプキャストテキストを明示する必要があります。

使用してみてください:

TO_TIMESTAMP(date_string,'YYYY-MM-DD')
0
Rajesh Jaiswal