如何在Teradata中将列转换为dateformat?

时间:2015-11-30 11:33:19

标签: date teradata

我有一个bigint数据类型(以秒为单位)的列应该添加到日期中,所以我需要将此列转换为dateformat。

2 个答案:

答案 0 :(得分:1)

必须针对Teradata中的时间戳数据类型执行算术运算。日期数据类型没有与之关联的时间元素。以下SQL应该帮助您指明正确的方向:

SELECT CAST(CAST(1234 AS BIGINT) AS INTERVAL SECOND(4)) AS Seconds_
     , CURRENT_TIMESTAMP(0) AS CurrentTimestamp_
     , CURRENT_TIMESTAMP + Seconds_ AS NewTimeStamp

答案 1 :(得分:1)

如果秒数小于864000000,您只需使用区间运算:

CAST(col AS TIMESTAMP) + (bigintcol * INTERVAL '0000 00:00:01' DAY TO SECOND)

基于您的other question输入是Unixtime,这两个函数用于将它们从/转换为Teradata时间戳:

/**********
Converting Unix/POSIX time to a Timestamp 

Unix time: Number of seconds since 1970-01-01 00:00:00 UTC not counting leap seconds (currently 24 in 2011)

Also working for negative numbers.
The maximum range of Timestamps is based on the range of INTEGERs:
1901-12-13 20:45:52 (-2147483648) to 2038-01-19 03:14:07 (2147483647)

Can be changed to use BIGINT instead of INTEGER

20101211 initial version - Dieter Noeth
**********/

REPLACE FUNCTION UnixTime_to_TimeStamp (UnixTime INT)
RETURNS TimeStamp(0)
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
SQL SECURITY DEFINER
COLLATION INVOKER
INLINE TYPE 1
RETURN 
CAST(DATE '1970-01-01' + (UnixTime / 86400) AS TIMESTAMP(0))
+ ((UnixTime MOD 86400) * INTERVAL '00:00:01' HOUR TO SECOND)
;

SELECT
   UnixTime_to_TimeStamp(-2147483648)
  ,UnixTime_to_TimeStamp(0)
  ,UnixTime_to_TimeStamp(2147483647)
;


/**********
Converting a Timestamp to Unix/POSIX time

Unix time: Number of seconds since 1970-01-01 00:00:00 UTC not counting leap seconds (currently 24 in 2011)

The maximum range of Timestamps is based on the range of INTEGERs:
1901-12-13 20:45:52 (-2147483648) to 2038-01-19 03:14:07 (2147483647)

Can be changed to use BIGINT instead of INTEGER

20101211 initial version - Dieter Noeth
**********/
REPLACE FUNCTION TimeStamp_to_UnixTime (ts TimeStamp(6))
RETURNS INTEGER
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
SQL SECURITY DEFINER
COLLATION INVOKER
INLINE TYPE 1
RETURN 
(CAST(ts AS DATE) - DATE '1970-01-01') * 86400
+ (EXTRACT(HOUR FROM ts) * 3600)
+ (EXTRACT(MINUTE FROM ts) * 60)
+ (EXTRACT(SECOND FROM ts))
;

SELECT
   TimeStamp_to_UnixTime(TIMESTAMP '1901-12-13 20:45:52')
  ,TimeStamp_to_UnixTime(CURRENT_TIMESTAMP)
  ,TimeStamp_to_UnixTime(TIMESTAMP '2038-01-19 03:14:07')
;