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.啊!我看到你发布了一个答案;如果你成功了,我很高兴!