我有一个用于sql loader的工作控制文件,可以在其中以所需的各种格式上载时间戳。
my_timestamp TIMESTAMP \"dd-MON-yy hh.mi.ss.ff6 PM\",
但是我想将以毫秒为单位的.csv文件中的时间戳上传到数据库的NUMBER字段中。有什么建议,甚至可能吗?
我假设您要剥离毫秒部分并将其分开存储。
未经测试:
...
my_timestamp TIMESTAMP "dd-MON-yy hh.mi.ss.ff6 PM"
my_milliseconds NUMBER "regexp_substr(:my_timestamp, '\.(\d+) ', 1,1,null,1)"
...
但这有效,因此上面的应该起作用:
select regexp_substr('07-JAN-14 04.24.00.123456 PM', '\.(\d+) ', 1,1,null,1)
from dual;
返回与一个或多个数字的字符串模式匹配的第一个组(由括号包围),该字符串的模式由左侧的句点和右侧的空格包围。
编辑:哦,您需要将整个时间戳转换为UNIX时间,这是自1970年1月1日0:0:0(纪元)以来的秒数。
首先,您需要公式将日期转换为UNIX时间。稍作谷歌搜索就发现了这一点:
SELECT (cast(to_timestamp('14.03.2010 08:16:22.123456 AM','dd.mm.yyyy hh:mi:ss.FF6 AM')as date) - TO_DATE('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SS')) *
24 * 60 * 60
FROM DUAL;
结果为“ 1268554582”。使用纪元转换器将此UNIX时间转换回日期:http : //www.epochconverter.com/验证返回了正确的日期。
那么,如何在控制文件中使用它呢?如果您可以按上述方式选择它,则可以将其放在控制文件中,如下所示:
...
my_timestamp TIMESTAMP "dd-MON-yy hh.mi.ss.ff6 PM"
my_unixtime NUMBER "(cast(:my_timestamp)as date) - TO_DATE('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SS')) *
24 * 60 * 60"
...
您可能需要EXPRESSION关键字,但我不确定:
my_unixtime NUMBER EXPRESSION "(cast(:my_timestamp)as date) - TO_DATE('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SS')) *
24 * 60 * 60"
现在,它适用于一列,但是如果有很多列,或者您想重用该列,该怎么办?为了实现重用和可维护性,请使用接受时间戳并返回如上所述的unixtime的函数将代码放在一个位置,然后从您的控制文件中调用该函数:
...
my_timestamp TIMESTAMP "dd-MON-yy hh.mi.ss.ff6 PM"
my_unixtime NUMBER "my_timestamp_to_unix_converter(:my_timestamp)"
...
注意事项:
因为UNIX时间是自1970年1月1日以来的秒数,而不是毫秒,所以损失了毫秒数。如果毫秒对您很重要,则可能需要单独保存它们,如上所示。
到2038年时可能会遇到麻烦:http://en.wikipedia.org/wiki/Year_2038_problem
资源:
http://www.epochconverter.com/
http://orcasoracle.squarespace.com/oracle-rdbms/2009/10/9/converting-timestamp-to-date.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句