从teradata中的时间戳中提取时间,同时减少秒和毫秒

时间:2014-09-10 23:08:47

标签: sql timezone timestamp teradata truncate

我正在尝试将时间戳转换为以下示例格式,' yyyy-mm-dd hh:mm:ss.fff',以小时和分钟为单位。稍后我将使用此字段作为分组维度,因此删除秒和毫秒非常重要。我希望结果值仍然被解释为不需要的真实时间,所以如果我得到一个字符串我会没事的。最后也是最重要的时间戳是UTC时间,我需要将它转换为美国东部。

非常感谢对此提供任何帮助。谢谢

2 个答案:

答案 0 :(得分:1)

在我看来,Teradata中的时间戳格式化是一种痛苦,其中一些内容的记录很少。

对于Teradata中的时区转换,请使用<TSCOLUMN> at <difference from UTC>。因此对EST: <TS COLUMN> at -5。 (至少我认为EST是UTC -5。)

对于您想要的格式,您必须将其保留为char列。 Teradata不会让你有一个没有秒的时间戳列。因此,根据您上面的示例格式:

cast (<TS COLUMN> at -5 as char(16))

编辑: 正如所指出的,使用小时差异进行tz转换并不是一个好主意。您可以使用此Teradata link中列出的AT <TZ NAME>。所以,对于东方,你会使用:

<TS COLUMN> AT 'America Eastern'

由于它目前是DST,因此目前会返回4小时的差异。

答案 1 :(得分:0)

只需减去秒数:

ts - (extract(second from ts) * interval '1.000' second)

然后减去5小时以调整EST:

ts - (extract(second from ts) * interval '1.000' second)
   - interval '5' hour

要将时间戳转换为字符串,您需要应用FORMAT:

cast(cast(ts as format 'yyyy-mm-ddBhh:mi') as char(16))

或TD14中的Oracle TO_CHAR:

to_char(ts, 'yyyy-mm-dd hh24:mi')

编辑: 当您需要应用夏令时时,您应该使用

(ts - (extract(second from ts) * interval '1.000' second))
   AT 'America Eastern'

当然这会将数据类型更改为TIMESTAMP WITH TIME ZONE,但无论如何都需要时区信息。时区