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

Gia*_*uca 2 string timestamp casting 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;
Run Code Online (Sandbox Code Playgroud)

Aur*_*èle 8

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

这是我做的timestamp返回类型:

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

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

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

这假设-use_local_tz_for_unix_timestamp_conversions启动标志关闭(这是默认值).


Gia*_*uca 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;
Run Code Online (Sandbox Code Playgroud)