【问题标题】:Date insert through parameter in Oracle通过Oracle中的参数插入日期
【发布时间】:2015-07-03 02:52:34
【问题描述】:

我正在 oracle 中设置一个存储过程。它接受许多参数。其中有几个是“日期”类型的。

在我的应用程序中,我检查一个值,如果它符合这样的特定条件,则分配默认值:

private static string FixInputString(string s)
{
    return string.IsNullOrEmpty(s) ? "-1" : s;
}

然后,我将其格式化为 Oracle 的日期

private static string ConvertToOracleDate(string s)
{
    var temp = string.IsNullOrEmpty(s) || string.Equals(s, "-1", StringComparison.InvariantCultureIgnoreCase)
        ? "01-Jan-1900" : Convert.ToDateTime(s).ToString("dd-MMM-yyyy");
    return temp;
}

当我运行它时,我在变量中有这个值:

然后我设置参数如下:

new SpParameterOracle
{
    Key = "p_SGND_DT",
    Value = ConvertToOracleDate(FixInputString(form.SignedOnDate)),
    Direction = ParameterDirection.Input,
    Type = OracleDbType.Date
},

这是我将参数分配给 OracleCommand 时的参数内容:

我的存储过程,这样处理输入参数:

decode(TO_CHAR(p_SGND_DT, 'mm/dd/yyyy'), '01/01/1900', null, TO_DATE(p_SGND_DT, 'DD-MON-YYYY')),

我也试过这个:

decode(TO_CHAR(p_SGND_DT, 'mm/dd/yyyy'), '01/01/1900', null, p_SGND_DT),

表格中的结果值是这样的:

为什么它从 1901 年 1 月 1 日更改为 2001 年 1 月 1 日???

到目前为止,我已经尝试在应用程序和存储过程中切换格式,结果还是一样。

任何想法都将不胜感激。


正如其中一个答案所建议的那样,转换是这个问题的罪魁祸首。

我没有处理它,而是修改了存储过程的逻辑以及代码。 在存储过程中,我将所有必要的字段设为可选,如下所示:

p_SGND_DT in date default null,

然后我只需在表中插入一个值。 在应用程序方面,我修改了代码以仅发送使用的参数并省略其余为空的参数。

感谢您的帮助并为我指明了正确的方向。非常感谢。

【问题讨论】:

  • 你是不是刚刚尝试从 sqlplus 调用存储的 proc 并查看结果是什么?
  • 不,但我现在就去做...
  • 对格式不满意:'dd-MON-yyyy'。更改为“dd/MM/yyyy”。结果相同:'1/1/2001'。

标签: c# oracle


【解决方案1】:

问题是因为您的存储过程中的TO_DATE(p_SGND_DT, 'DD-MON-YYYY')p_sgnd_dt 是 DATE 数据类型(或者您已经暗示过),因此无需尝试再次将其转换为日期。

你应该只对字符串使用 to_date。

如果你对已经是日期的东西执行 TO_DATE(),会发生什么是 Oracle 必须先将日期隐式转换回字符串,然后再将其转换回日期。因此,您的 TO_DATE(p_SGND_DT, 'DD-MON-YYYY') 实际上变为:

TO_DATE(TO_CHAR(p_SGND_DT, <nls_date_format parameter>), 'DD-MON-YYYY')

默认的 nls_date_format 是 'DD-MON-YY',这意味着您现在已经丢失了年份的前两位数字,当 Oracle 尝试将其转换回四位数字年份时,它会猜测前两位数字是什么会 - 并让他们错了。

我不确定您为什么首先将参数转换为字符串来进行比较 - 最好是:

decode(p_SGND_DT, to_date('01/01/1900', 'dd/mm/yyyy'), null, p_SGND_DT)

或者,如果您尝试从传入的日期中删除任何时间元素:

decode(p_SGND_DT, to_date('01/01/1900', 'dd/mm/yyyy'), null, trunc(p_SGND_DT))

【讨论】:

  • 同意。但即使我确实放弃了第二个“to_date”,它仍然是一样的。 2001 年 1 月 1 日
  • 你能提供你的程序规范吗? IE。告诉您有关预期参数等信息的位。
  • 我不确定你的意思?你想看看整个过程吗?
  • 理想情况下,是的,但至少是规范的位 - 例如创建或替换过程 proc_name (param1 in date, ....)
猜你喜欢
  • 2012-03-24
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2014-12-23
  • 2017-01-03
  • 2021-03-13
相关资源
最近更新 更多