【问题标题】:string to date - hive SQL迄今为止的字符串 - 配置单元 SQL
【发布时间】:2017-07-28 15:20:24
【问题描述】:

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

我有一列有时间戳,但在表中设置了一个字符串。我尝试了以下方法:所有这些都返回 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'

【问题讨论】:

  • 为什么需要日期?你能告诉我们完整的查询吗?
  • 我需要日期来过滤掉表格,而我只需要 3 年的数据,否则表格有 25 年的数据。
  • 以下是我正在使用的解决方法:
  • ,SUBSTR(activitydate,4,2) AS DT ,SUBSTR(activitydate,0,2) AS MONTH ,SUBSTR(activitydate,7,4) AS YEAR

标签: sql string date hive hiveql


【解决方案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)

【讨论】:

    【解决方案2】:

    您能否尝试将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 格式存储您的时间戳。将日期存储为文本或非标准格式的文本会对大多数数据库造成不利影响。

    【讨论】:

    • 遇到内存问题
    • 正如我所提到的,您应该使用日期类型,或者如果您必须使用字符串,则使用 ISO 格式。您也可以使用子查询改写我的答案。
    猜你喜欢
    • 2021-03-12
    • 2011-04-18
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    相关资源
    最近更新 更多