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

使用Dapper与Npgsql操作Postgres的INTERVAL时出现语法错误

问题原因及解决方法

你的问题出在PostgreSQL的INTERVAL语法与参数化结合的方式上,原SQL写法不符合PostgreSQL的参数化规则,导致语法错误。

错误原因

PostgreSQL中,INTERVAL关键字后需要跟字符串字面量(比如INTERVAL '90 DAY'),不能直接将参数插入到INTERVAL和单位之间。你原代码里的INTERVAL @ageInDays DAY写法,数据库无法识别参数的位置,因此抛出语法错误。

修正方案

推荐以下两种可行的修正方式:

方案1:用数值乘以固定间隔(推荐)

修改SQL语句,将int类型的天数参数乘以INTERVAL '1 DAY',Npgsql支持这种数值与间隔的运算,完美适配你当前的参数类型:

int ageInDays = 90;
// 修改后的SQL语句
string mysql = "DELETE FROM Monitorvalues m1 WHERE lastupdate < current_date - @ageInDays * INTERVAL '1 DAY'";

using (var connection = GetConnection)
{
    var dynamicParameters = new DynamicParameters();
    dynamicParameters.Add("ageInDays", ageInDays);
    return await connection.ExecuteScalarAsync<int>(mysql, dynamicParameters);
}

方案2:传递完整的间隔字符串

如果你愿意调整参数类型,也可以直接传递符合PostgreSQL间隔格式的字符串:

string ageInterval = "90 DAY";
string mysql = "DELETE FROM Monitorvalues m1 WHERE lastupdate < current_date - INTERVAL @ageInterval";

using (var connection = GetConnection)
{
    var dynamicParameters = new DynamicParameters();
    dynamicParameters.Add("ageInterval", ageInterval);
    return await connection.ExecuteScalarAsync<int>(mysql, dynamicParameters);
}

验证说明

两种方案都能让Dapper正确将参数传递给PostgreSQL,避免语法错误。第一种方案保留了你原本的int参数类型,无需额外类型转换,更贴合现有代码逻辑。

内容的提问来源于stack exchange,提问作者jason.kaisersmith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:12:44