You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Npgsql C#参数化Update语句中Interval语法错误求助

解决PostgreSQL中Npgsql参数化INTERVAL的语法错误

你遇到的语法错误是因为PostgreSQL不支持INTERVAL @参数 '单位'这种写法,正确的参数化INTERVAL方式有两种,推荐使用数值乘以单个INTERVAL单位的写法,更安全且符合语法规范:

正确写法示例

var command = _dataSource.CreateCommand(
    @"UPDATE ""BulkProposal"" 
      SET ""UploadDataJson"" = NULL 
      WHERE ""CreatedDate"" <= NOW() - @deleteInterval * INTERVAL '1 day' 
        AND ""UploadDataJson"" IS NOT NULL;");

command.Parameters.AddWithValue("deleteInterval", _deleteIntervalInDays);
await _npgsqlConnection.OpenAsync();
recordsDeleted = await command.ExecuteNonQueryAsync();

写法说明

PostgreSQL的INTERVAL语法规则:

  • 不能将数值参数和单位字符串分开写在INTERVAL关键字后
  • 可以通过数值参数乘以单个INTERVAL单位的方式实现动态间隔,比如@deleteInterval * INTERVAL '1 day',数据库会正确识别参数并计算时间差

可选替代写法(不推荐)

如果一定要用字符串形式传递完整间隔,可以将参数设为包含数值和单位的字符串:

var command = _dataSource.CreateCommand(
    @"UPDATE ""BulkProposal"" 
      SET ""UploadDataJson"" = NULL 
      WHERE ""CreatedDate"" <= NOW() - INTERVAL @intervalString 
        AND ""UploadDataJson"" IS NOT NULL;");

command.Parameters.AddWithValue("intervalString", $"{_deleteIntervalInDays} days");
await _npgsqlConnection.OpenAsync();
recordsDeleted = await command.ExecuteNonQueryAsync();

这种写法需要确保参数内容安全(避免SQL注入风险),因此优先推荐第一种数值相乘的写法。

内容的提问来源于stack exchange,提问作者dionysus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:32:47