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

Posted

技术标签:

【中文标题】如何在 Oracle DB 的 SQL 查询中传递 DateTime 参数【英文标题】:How to pass DateTime parameter in SQL query for Oracle DB 【发布时间】:2014-06-06 13:13:08 【问题描述】:

我需要在 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 DB 的 SQL 查询中传递 DateTime 吗?

附: 我试过的: -我已经创建了一个具有特征的 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() 方法),但在这种情况下,我似乎失去了分钟和秒

【问题讨论】:

How to pass datetime from c# to sql correctly?的可能重复 你需要使用SqlDbType.DateTime,不要使用ToString() 实际上,如果您使用时间戳,则根本不应该在 中传递日期时间。时间戳标记时间。 IE。 SQL 为你添加了这个。 【参考方案1】:

做这个:

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);

【讨论】:

【参考方案2】:

尝试使用OracleParameter

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

command.Parameters.Add(para);

【讨论】:

当你使用 Oracle Data Provider 时(你应该做什么)你必须使用 OracleDbType.TimeStamp 而不是 DbType.DateTime

以上是关于如何在 Oracle DB 的 SQL 查询中传递 DateTime 参数的主要内容,如果未能解决你的问题,请参考以下文章

db2cmd如何执行sql文件并传递参数?

如何编写通用 SQL 查询以与所有 RDBMS(Oracle、SQL 服务器、MySql、DB2 等等)兼容的 (YYYY-MM-DD) 形式提取日期

使用命令将存储过程查询从 sql 文件导入 Oracle DB

oracle如何获取调用者的IP,机器名等信息,以及他们操作的SQL

SQL基础7:SQLSERVER、ORACLE、DB2中SQL语句查询表字段名、注释、字段类型

如何检索oracle sql查询的进度?