【问题标题】:Trying to convert string format (dd-mm-yyyy hh:mm:ss) in (yyyy-mm-dd hh:mm:ss) date format尝试将字符串格式 (dd-mm-yyyy hh:mm:ss) 转换为 (yyyy-mm-dd hh:mm:ss) 日期格式
【发布时间】:2019-06-04 11:01:10
【问题描述】:

我正在以这种格式在字符串变量中从 oracle 捕获日期 string val1 = "30-03-2019 16:42:58" 并尝试以(日期时间)格式将其存储在 sql 数据库中,例如 val2 = "2019-03-03 16:42:58.000"

在字符串变量中存储来自 oracle db 的日期

string val2 = row["t_in_o"].ToString();

并像插入sql一样

myCommand.Parameters.AddWithValue("@t_in_s",val2);

预期

string val2="30-03-2019 16:42:58"

字符串变量 val2 应该存储在 日期变量 date_V 为 date_V="2019-03-03 16:42:58.000"

错误信息 将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。 声明已终止。

【问题讨论】:

  • 为什么要通过 C# 传递数据?听起来这两个操作应该是一条 SQL 语句。
  • @GordonLinoff 实际上我的要求是从 oracle db 中获取值并将其存储在 sql db 中,它每 5 分钟安排一次
  • oracle和sql server的列类型有哪些?
  • @sidprashar 它是日期时间类型

标签: c# sql oracle


【解决方案1】:

您需要先将日期字符串转换为日期时间。

string val2= row["t_in_o"].ToString(); 
Datetime date = DateTime.Parse(val2);

myCommand.Parameters.Add("@t_in_s", SqlDbType.DateTime).Value = date;

【讨论】:

    【解决方案2】:

    Oracle 日期并没有真正的格式。

    如果你想在数据库中存储一个字符串,只需告诉 oracle 这是一个带有to_date的日期

    insert into Mytable (thedate)
    values 
    (to_date(:stringval1, 'DD-MM-YY HH24:MI:SS'))
    

    【讨论】:

    • 这是在 Oracle 中执行此操作的方法,如果您不想先在 C# 中执行此操作。旁注:如果您以values (date '2019-03-30') 的形式使用date literal expression,Oracle 日期确实 具有格式。但是这种表示法只支持日期,不支持时间。
    【解决方案3】:

    首先请注意,您尝试以毫秒为单位将值存储到 SQL 数据库,但您没有从 oracle 获得的字符串中(由于发布摘要),因此它将始终为 .000。

    但是您所要求的这个可以使用以下代码来完成:

        string val2 = DateTime.ParseExact(row["t_in_o"].ToString(), "dd-MM-yyyy HH:mm:ss", 
                                            CultureInfo.InvariantCulture)
                                            .ToString("yyyy-MM-dd HH:mm:ss.fff");
    

    请注意,我不知道您在 row["t_in_o"] 中存储值的类型,所以我将其视为 string,如果您将此值转换为 DateTime,则已经删除无用的 Convert.ToDataTime 并使用 row["t_in_o"].ToString("yyyy-MM-dd HH:mm:ss.fff");

    【讨论】:

    • 另外,Oracle 中的date 类型没有毫秒分辨率。为此,您需要timestamp。但阅读这个问题,我怀疑这是否是一项要求。
    • @GolezTrol 在这种情况下真的很奇怪,如果你在 Ocarcle 中没有毫秒,你不应该将它们粘贴到 SQL,如果需要,让 SQL 通过添加 .000 自行处理它们。或更改列类型并使用timestamp。同样在 SQL date 类型中也没有毫秒(它甚至没有小时)所以这也需要更改为 datetime
    • 我认为你把事情搞混了。 Oracle 有一个日期类型,它表示日期 + 时间,精度高达 1 秒。列没有日期时间类型。
    • 关于datetime我在谈论SQL的列类型
    • SQL 只是一个标准。这取决于具体的实现。在这种情况下,它是关于 Oracle 的,它没有 datetime 类型,只有 date 类型,实际上也可以包含 time 部分。在标准 SQL 中,有不同的日期和时间相关类型,but still no datetime
    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 2020-03-07
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2013-11-01
    相关资源
    最近更新 更多