今天有人问到在Trafodion中如何将一个数值转换为时间戳格式(timestamp),比如数值1500220712在Linux环境下代表某个具体的时间戳2017-07-16 23:58:32,
root@bigdata157 ~]# date -d @1500220712 +"%Y-%m-%d %H:%M:%S"
2017-07-16 23:58:32
那么在Trafodion中如果某个字段保存的值是整型数值,现在希望转换为方便识别的timestamp格式应该如何实现呢?
查看Trafodion官网上的SQL手册发现有一个函数CONVERTTIMESTAMP感觉比较像,于是尝试一下转换没有成功,错误提示要转换的数值不在正确的数据范围内。
SQL>select CONVERTTIMESTAMP(1500220712) from dual;
*** ERROR[8405] The operand of function CONVERTTIMESTAMP is out of range. [2017-11-30 13:37:06]
查看官方文档发现,CONVERTTIMESTAMP是用于转换Julian timestamp的,何为Julian timestamp?怎么用CONVERTIMESTAMP转换Julian timestamp?可以参考http://trafodion.incubator.apache.org/docs/sql_reference/index.html#converttimestamp_function
而这里我们使用的1500220712是一个Unix timestamp对应的整型,这个值是自’1970-01-01 00:00:00’开始日期以来的秒数,既然这样,如果我可以使用’1970-01-01 00:00:00’这个初始时间加上这个秒数再转换为timestamp不就是我们想要得到的当前日期了么?Trafodion提供了dateadd方法用于实现日期格式与与任意INVERTAL类型的加法(负数表示减法),因此这个转换可以表达成以下方式,
SQL>select dateadd(SECOND,1500220712,timestamp '1970-01-01 00:00:00') from dual;
(EXPR)
---------------------
2017-07-16 15:58:32.0
--- 1 row(s) selected.