将字符串转换为Impala中的时间戳

时间:2016-04-19 16:43:45

标签: string casting timestamp impala

如何将代表string格式(即"YYYY-MM-DD;HH:MM:SS")的日期时间的2016-04-11;19:38:01转换为正确的timestamp

我认为这会奏效,但事实并非如此。

select 
  from_unixtime(unix_timestamp(`date`, "YYYY-MM-DD;HH:MM:SS"))
from t1
limit 100;

3 个答案:

答案 0 :(得分:5)

正如@jbapple在对我的问题的评论中所建议的那样,问题在于大写。如Impala文档中所述

  

目前,格式字符串区分大小写,尤其是   区分m表示分钟,M表示月份。在Impala 1.3及更高版本中,   你可以切换元素的顺序,使用替代分隔符   字符,并为每个单元使用不同数量的占位符。   添加更多y,d,H等实例会生成输出字符串   零填充到请求的字符数。 M是个例外   几个月,M产生非填充值,如3,MM产生   零填充值,如03,MMM生成缩写的月份名称   例如Mar,不允许4个或更多M的序列。一个约会   包括所有字段的字符串可以是“yyyy-MM-dd HH:mm:ss.SSSSSS”,   “dd / MM / yyyy HH:mm:ss.SSSSSS”,“MMM dd,yyyy HH.mm.ss(SSSSSS)”或   占位符和分隔符的其他组合。

正确的写作方式是:

select 
  from_unixtime(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss")) 
from t1 
limit 100;

答案 1 :(得分:5)

from_unixtime()的返回类型不是“正确timestamp”,而是字符串。 (并且unix_timestamp()的返回类型不是...... timestamp,而是bigint)。

以下是我获取timestamp返回类型的方法:

select
  cast(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss") as timestamp)
from t1
limit 100;

为了完整起见,以下是我处理时区,本地格式化日期以及将它们存储为UTC时间戳的方法:

select
  to_utc_timestamp(cast(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss") as timestamp), "Europe/Paris")
from t1
limit 100;

这假定-use_local_tz_for_unix_timestamp_conversions启动标志已关闭(这是默认值)。

答案 2 :(得分:0)

涉及unix_timestamp的答案都没有对我在Cloudera v5上运行Impala起作用。 但是一个简单的select cast('1985-09-25 17:45:30.005' as timestamp);可以工作。

查看此doc