Hive cast string到目前为止dd-MM-yyyy

pel*_*e88 23 string hive casting date

如何将格式为'dd-MM-yyyy'的字符串转换为日期类型,格式为'dd-MM-yyyy'?

有点像:

CAST('12-03-2010' as date 'dd-mm-yyyy')
Run Code Online (Sandbox Code Playgroud)

Ard*_*dit 35

尝试:

from_unixtime(unix_timestamp('12-03-2010' , 'dd-MM-yyyy'))
Run Code Online (Sandbox Code Playgroud)

  • 那仍然是*String*,带有*TimeStamp*格式.要将它转换为*Date*,你必须将它包装在`cast(to_date(from_unixtime(unix_timestamp(STR_DMY,'dd-MM-yyyy')))中作为日期) (40认同)
  • 是的,我希望有更好的方法来操纵Hive中的日期: - / (2认同)

Key*_*r00 12

如果我已正确理解它,您正在尝试将表示给定日期的String转换为另一种类型.

注意:(正如@Samson Scharfrichter所说)

  • 日期的默认表示形式是ISO8601
  • 日期以二进制形式存储(不作为字符串)

有几种方法可以做到这一点.而且你接近解决方案.我会使用CAST(转换为DATE_TYPE):

SELECT cast('2018-06-05' as date); 
Run Code Online (Sandbox Code Playgroud)

结果:2018-06-05 DATE_TYPE

或(取决于你的模式)

select cast(to_date(from_unixtime(unix_timestamp('05-06-2018', 'dd-MM-yyyy'))) as date)
Run Code Online (Sandbox Code Playgroud)

结果:2018-06-05 DATE_TYPE

如果您决定将ISO8601转换为日期类型:

select cast(to_date(from_unixtime(unix_timestamp(regexp_replace('2018-06-05T08:02:59Z', 'T',' ')))) as date);
Run Code Online (Sandbox Code Playgroud)

结果:2018-06-05 DATE_TYPE

Hive有自己的功能,为了说明这些日期和演员函数,我写了一些例子:

日期和时间戳函数示例:

将字符串/时间戳/日期转换为日期

SELECT cast(date_format('2018-06-05 15:25:42.23','yyyy-MM-dd') as date); -- 2018-06-05 DATE_TYPE
SELECT cast(date_format(current_date(),'yyyy-MM-dd') as date); -- 2018-06-05 DATE_TYPE
SELECT cast(date_format(current_timestamp(),'yyyy-MM-dd') as date);  -- 2018-06-05 DATE_TYPE
Run Code Online (Sandbox Code Playgroud)

将字符串/时间戳/日期转换为BIGINT_TYPE

SELECT to_unix_timestamp('2018/06/05 15:25:42.23','yyyy/MM/dd HH:mm:ss'); -- 1528205142 BIGINT_TYPE
SELECT to_unix_timestamp(current_date(),'yyyy/MM/dd HH:mm:ss'); -- 1528205000 BIGINT_TYPE
SELECT to_unix_timestamp(current_timestamp(),'yyyy/MM/dd HH:mm:ss'); -- 1528205142 BIGINT_TYPE
Run Code Online (Sandbox Code Playgroud)

将字符串/时间戳/日期转换为STRING

SELECT date_format('2018-06-05 15:25:42.23','yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE
SELECT date_format(current_timestamp(),'yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE
SELECT date_format(current_date(),'yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE
Run Code Online (Sandbox Code Playgroud)

将BIGINT unixtime转换为STRING

SELECT to_date(from_unixtime(unixtime,'yyyy/MM/dd HH:mm:ss')); -- 2018-06-05 STRING_TYPE
Run Code Online (Sandbox Code Playgroud)

将String转换为BIGINT unixtime

SELECT unix_timestamp('2018-06-05 15:25:42.23','yyyy-MM-dd') as TIMESTAMP; -- 1528149600 BIGINT_TYPE
Run Code Online (Sandbox Code Playgroud)

将字符串转换为TIMESTAMP

SELECT cast(unix_timestamp('2018-06-05 15:25:42.23','yyyy-MM-dd') as TIMESTAMP); -- 1528149600 TIMESTAMP_TYPE
Run Code Online (Sandbox Code Playgroud)

幂等(String - > String)

SELECT from_unixtime(to_unix_timestamp('2018/06/05 15:25:42.23','yyyy/MM/dd HH:mm:ss')); -- 2018-06-05 15:25:42 STRING_TYPE
Run Code Online (Sandbox Code Playgroud)

幂等(日期 - >日期)

SELECT cast(current_date() as date); -- 2018-06-26 DATE_TYPE
Run Code Online (Sandbox Code Playgroud)

当前日期/时间戳

SELECT current_date(); -- 2018-06-26 DATE_TYPE
SELECT current_timestamp(); -- 2018-06-26 14:03:38.285 TIMESTAMP_TYPE
Run Code Online (Sandbox Code Playgroud)


Sam*_*ter 5

AFAIK您必须重新格式化ISO格式的字符串才能将其转换为日期:

cast(concat(substr(STR_DMY,7,4), '-',
            substr(STR_DMY,1,2), '-',
            substr(STR_DMY,4,2)
           )
     as date
     ) as DT
Run Code Online (Sandbox Code Playgroud)

要将日期显示为具有特定格式的字符串,那么它是相反的方式,除非你有Hive 1.2+并且可以使用date_format()

=>你顺便查看了文档吗?