字符串到目前为止 - hive SQL

时间:2017-07-28 15:20:24

标签: sql hiveql

我在蜂巢环境中运行查询。

我有一个列有时间戳,但在表中设置了一个字符串。我尝试了以下内容:所有这些都返回Null

SELECT 
,To_date(activitydate)

角色:

,cast(activitydate as timestamp)

这是表格中数据的设置方式:

感谢有关如何转换此内容的任何输入:

05/12/2017 00:00:00     



SELECT 
 cust_id
,to_date(activitydate)  activity_date
,type type_of_contact


FROM repl_task

WHERE to_date(activitydate) BETWEEN '2014-01-01' AND '2017-01-01' ;

如果我执行此操作,我的内存不足:

SELECT 
 cust_id
,activitydate
,SUBSTR(activitydate,4,2) AS DT
,SUBSTR(activitydate,0,2) AS MONTH 
,SUBSTR(activitydate,7,4) AS YEAR
,type 


FROM task 

WHERE activitydate >='01/01/2016 00:00:00'

2 个答案:

答案 0 :(得分:1)

您可以尝试将to_date()与ISO格式的时间戳的日期部分一起使用:

SELECT 
    cust_id,
    TO_DATE(CONCAT(SUBSTR(activitydate, 7, 4), '-',
                   SUBSTR(activitydate, 0, 2), '-',
                   SUBSTR(activitydate, 4, 2))) activity_date
    type type_of_contact
FROM repl_task
WHERE
    TO_DATE(CONCAT(SUBSTR(activitydate, 7, 4), '-',
                   SUBSTR(activitydate, 0, 2), '-',
                   SUBSTR(activitydate, 4, 2)))
        BETWEEN '2014-01-01' AND '2017-01-01';

如果这样运行但效果不是很好,那么您应该考虑以ISO格式存储时间戳。将日期存储为文本或以非标准格式存储文本会对大多数数据库造成惩罚。

答案 1 :(得分:1)

unix_timestamp函数将给定格式转换为unix时间戳,from_unixtime函数将unix时间戳转换为给定格式:

hive> select from_unixtime(unix_timestamp('01/01/2016 00:00:00','MM/dd/yyyy HH:m:ss'),'yyyy-MM-dd');
OK
2016-01-01
Time taken: 0.118 seconds, Fetched: 1 row(s)