Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 在时间戳(6)列中插入字符串_Oracle_Scala_Apache Spark_Timestamp - Fatal编程技术网

Oracle 在时间戳(6)列中插入字符串

Oracle 在时间戳(6)列中插入字符串,oracle,scala,apache-spark,timestamp,Oracle,Scala,Apache Spark,Timestamp,我有这样的时间戳:2019-06-13 13:22:30.521000000 我正在使用Spark/Scala脚本将它们插入到Oracle表中。Oracle中的列是Timestamp(6),应该保持这样 我就是这么做的: Spark中的df包含一列时间戳: +-----------------------------+ | time | +-----------------------------+ |2019-06-13 13:22:30.5210

我有这样的时间戳:
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| 
+--------------------------+

毫秒不包括在内。需要帮忙吗?谢谢大家!

如果您的
time
列是时间戳类型,您可以尝试
date\u格式


我不知道您使用的工具,但是-如果它只是Oracle,那么使用适当的格式掩码来设置时间戳就可以了。看看是否有帮助

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>

[编辑,因为你看不懂我的心思(至少我希望如此)

正如您(Abderrahman)所说,您有一个字符串,但仍然希望插入时间戳,也许您可以使用存储过程。下面是一个示例:

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调用过程。如果您知道如何调用,那么只需传递您拥有的字符串,它就应该正确地插入到数据库中;注意正确的格式掩码!

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

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

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))
所有其他解决方案都会返回空值或时间戳,而不会返回毫秒


希望它能帮助别人。

我在Oracle的专栏是timestamp(6)。在Spark中是Strings,@Abderrahmen面临的问题是Spark方面的问题。Oracle只是目标数据库。@Cesar,这是一个问题。像往常一样,它可以使用多个选项进行修复。你说它在Spark方面。我不知道Spark,但是-让我试着帮助我知道的方式,这就是Oracle方面。从我的观点来看,它是不管它是如何“解决”的,只要它能工作就行。我想听听Abderrahmanm对它的看法(特别是存储过程的建议)。谢谢你的明确回答。但我不允许接触Oracle。表在那里,我需要使用Spark在其中插入行。再次感谢你。不客气。抱歉,我无法帮助你使用Spark。希望其他人会。P.S.啊!我看到你发布了一个答案;如果你成功了,我很高兴!