如何将代表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;
答案 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