【问题标题】:insert a String into timestamp(6) column将字符串插入时间戳(6)列
【发布时间】:2019-11-25 14:53:01
【问题描述】:

我的时间戳看起来像这样:2019-06-13 13:22:30.521000000

我正在使用 Spark/Scala 脚本将它们插入到 Oracle 表中。 Oracle 中的列是 Timestamp(6),应该保持这样。

这就是我的工作:

我在 Spark 中拥有的是一个 df,其中包含一个带有我的时间戳的列:

+-----------------------------+
|   time                      |
+-----------------------------+
|2019-06-13 13:22:30.521000000| 
+-----------------------------+

我执行以下操作:

df.withColumn("time", (unix_timestamp(substring(col("time"), 1, 23), "yyyy-MM-dd HH:mm:ss.SSS") + substring(col("time"), -6, 6).cast("float") / 1000000).cast(TimestampType))

我使用与 Oracle 的连接插入(插入脚本已经过测试并且工作正常)。 但在 Oracle 中,我只在表中看到以下内容:

+--------------------------+
|   time                   |
+--------------------------+
|2019-06-13 13:22:30.000000| 
+--------------------------+

不包括毫秒。请问有什么帮助吗?谢谢!

【问题讨论】:

    标签: oracle scala apache-spark timestamp


    【解决方案1】:

    如果你的time列是时间戳类型,你可以试试date_format

    https://sparkbyexamples.com/spark/spark-sql-how-to-convert-date-to-string-format/

    【讨论】:

    【解决方案2】:

    我不知道您使用的工具,但是 - 如果它只是 Oracle,那么带有适当格式掩码的 to_timestamp 就可以完成这项工作。看看有没有帮助。

    SQL> create table test (col timestamp(6));
    
    Table created.
    
    SQL> insert into test (col) values
      2    (to_timestamp('2019-06-13 13:22:30.521000000', 'yyyy-mm-dd hh24:mi:ss.ff'));
    
    1 row created.
    
    SQL> select * From test;
    
    COL
    ---------------------------------------------------------------------------
    13.06.19 13:22:30,521000
    
    SQL>
    

    [编辑,因为你无法读懂我的想法(至少,我希望如此)

    正如您 (AbderrahmenM) 所说,您有一个 字符串 但仍想插入时间戳,也许您可​​以使用存储过程。这是一个例子:

    SQL> create or replace procedure p_test (par_time in varchar2)
      2  is
      3  begin
      4    insert into test (col) values
      5      (to_timestamp(par_time, 'yyyy-mm-dd hh24:mi:ss.ff'));
      6  end;
      7  /
    
    Procedure created.
    
    SQL> exec p_test('2019-06-13 13:22:30.521000000');
    
    PL/SQL procedure successfully completed.
    
    SQL> select * from test;
    
    COL
    -------------------------------------------------------------------
    13.06.19 13:22:30,521000
    
    SQL>
    

    现在,我唯一不能帮助的是如何从 Spark 调用过程。如果你知道怎么做,那么只需传递你拥有的字符串,它就应该被正确地插入到数据库中;注意正确的格式掩码!

    【讨论】:

    • @AbderrahmenM 面临的问题是在Spark 方面。 Oracle 只是目标数据库。
    • @Cesar,这是一个问题。像往常一样,可以使用多个选项来修复它。你说它在 Spark 方面。我不了解 Spark,但是 - 让我尝试以我知道的方式提供帮助,这就是 Oracle 方面。从我的角度来看,只要它有效,它如何“解决”并不重要。我想听听 AbderrahmenM 对此有何评论(尤其是存储过程建议)。
    • 感谢您的明确答复。但我不能碰甲骨文。表在那里,我需要使用 Spark 在其中插入行。再次感谢您
    • 不客气。抱歉,我无法帮助您使用 Spark。希望,别人会。附言啊!我看到你发布了一个答案;如果你成功了,我很高兴!
    【解决方案3】:

    我感谢所有试图帮助我的人。

    这是我为获得所需输出所做的:

    df.withColumn("time", (unix_timestamp(substring(col("time"), 1, 23), "yyyy-MM-dd HH:mm:ss.SSS") + substring(col("time"), -9, 9).cast("float") / 1000000000).cast(TimestampType))
    

    所有其他解决方案都在没有毫秒的情况下不断返回 null 或时间戳。

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      相关资源
      最近更新 更多