如何在Oracle数据库的SQL查询中传递DateTime参数

3

我需要在SQL查询的WHERE子句中包含一些“TIMESTAMP”字段:

SELECT * FROM PERSON WHERE PSN_CREATED_DATE >= :createdPrior

在我的代码中,createdPrior参数是以下方式定义的

...
command.Parameters.Add(":createdPrior", Miscellaneous.convertToOracleTimeStamp(createdPrior));
...

static class Miscellaneous
{
    public static OracleTimeStamp convertToOracleTimeStamp(DateTime dateTime)
    {
        OracleTimeStamp result = new OracleTimeStamp(dateTime);
        return result;
    }
}

因此,我收到了以下异常:

异常:附加信息:ORA-00932:不一致的数据类型:预期 TIMESTAMP 而得到 NUMBER

你能告诉我如何在Oracle数据库的SQL查询中传递日期时间?

P.S. 我尝试过: - 我创建了一个具有特征的Oracle参数。

OracleParameter para = new OracleParameter();
para.ParameterName = ":createdPrior";
para.Direction = System.Data.ParameterDirection.Input;
para.OracleDbType = OracleDbType.TimeStamp;
para.Value = Miscellaneous.convertToOracleTimeStamp(createdPrior);

-我只传递了日期时间(DateTime)。但是我收到了另一个异常。

-我尝试将参数转换为日期类型(DATE),使用to_date()方法,但在这种情况下,似乎我失去了分钟和秒。


可能是重复的问题:如何正确地从C#传递datetime到SQL? - Liam
1
你需要使用 SqlDbType.DateTime,不要使用 ToString() - Liam
实际上,如果您正在使用时间戳,您根本不应该传递日期时间。时间戳“盖章时间”。也就是说,SQL会为您添加这个。 - Liam
2个回答

3

请完成以下任务:

SELECT * FROM PERSON WHERE PSN_CREATED_DATE >= TO_TIMESTAMP(:createdPrior, 'yyyyMMddHH24missffff')

或者在C#中使用TimeStamp参数,应该像这样。
OracleParameter para = new OracleParameter(":createdPrior", OracleDbType.TimeStamp, ParameterDirection.Input);
para.Value = (Oracle.DataAccess.Types.OracleTimeStamp)value;
command.Parameters.Add(para);

0

尝试使用OracleParameter

OracleParameter para = new OracleParameter();
para.ParameterName = ":createdPrior";
para.Direction = ParameterDirection.Input;
para.DbType = DbType.DateTime;
para.Value = value;

command.Parameters.Add(para);

当您使用Oracle数据提供程序(建议使用)时,必须使用OracleDbType.TimeStamp而不是DbType.DateTime - Wernfried Domscheit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接