PrestoSQL(trino)和HiveSQL的日期格式转换对比

本文介绍在Hive和Presto中进行日期时间处理的方法,包括获取当前时间、字符串日期与时间戳之间的转换、时间戳转字符串日期、字符串日期格式转换、日期加减等常见操作。

1. 获取当前时间

--hive
hive
select from_unixtime(unix_timestamp());  --> 2021-01-06 22:53:16    --精确到今天的时分秒
select from_unixtime(unix_timestamp('2021-12-07 13:01:03'),'yyyy-MM-dd HH:mm:ss'); -->2021-12-07 13:01:03 --精确到今天的时分秒指定格式
select current_date; --> 2021-01-06   -- 今天的年月日
select unix_timestamp(); --> 1609944783  --获取当前时间戳

--presto
select now();或者select current_timestamp --> 2021-01-06 22:49:08.899 Asia/Shanghai  --精确到今天的时分秒毫秒且带时区
select current_date; --> 2021-01-06  -- 今天的年月日
select current_date - interval '1' day; --> 2021-01-05  --昨天的年月日

2.字符串日期转时间戳

--hive
select unix_timestamp('2021-01-08 10:36:15','yyyy-MM-dd HH:mm:ss')  --> 输出long类型timestamp:1610073375

--presto
select to_unixtime(cast('2021-01-08 13:53:36' as timestamp))  --> 输出long类型timestamp:1610085216

3.时间戳转字符串日期

--hive
select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss')  -->输出varchar类型日期:2021-01-08 15:04:08

--presto
select format_datetime(from_unixtime(1610085216),'yyyy-MM-dd HH:mm:ss') -->输出varchar类型日期:2021-01-08 13:53:36

4. 字符串日期格式转换

--hive
select from_unixtime(unix_timestamp('2021-01-08 10:36:15','yyyy-MM-dd HH:mm:ss'),'yyyy-MM-dd') -->输出varchar类型日期:2021-01-08
select to_date('2021-01-08 10:36:15')  -->输出varchar类型日期:2021-01-08
select to_date(from_unixtime(unix_timestamp('20210110','yyyyMMdd'))); -->输出varchar类型日期:2021-01-10

--presto
select date(cast('2021-01-08 10:36:15' as timestamp))  --> 输出date类型日期:2021-01-08
select format_datetime(from_unixtime(to_unixtime(cast('2021-01-08 13:53:36' as timestamp))),'yyyy-MM-dd') -->输出varchar类型日期:2021-01-08
select format_datetime(date_parse('20210110','%Y%m%d'),'yyyy-MM-dd') -->输出varchar类型日期:2021-01-10

5. date类型转字符类型串日期

--presto
SELECT format_datetime(cast('2021-06-19' as date),'yyyy-MM-dd')  ->输出varchar类型日期:2021-06-19

6. 日期加减

--hive
select date_add('2021-01-08',2);  -->输出varchar类型日期:2021-01-10
select date_add(current_timestamp,2); -->输出varchar类型日期:2021-01-10

--presto
select date_add('day',-2,cast('2020-01-10' as date));  -->输出date类型日期:2021-01-08
select date_add('day',-2,current_date);   -->输出date类型日期:2021-01-06
select format_datetime(date_add('day',-1,cast('2021-06-19' as date)),'yyyy-MM-dd')

7. 日期截断

--hive
dd当天, MM所在月第一天,yyyy所在年第一天
SELECT trunc(CURRENT_DATE,'MM')   -->输出与输入类型一致的日期:2022-03-01

--presto
day当天, month所在月第一天,year所在年第一天
SELECT date_trunc('month',CURRENT_DATE) -->输出与输入类型一致的日期:2022-03-01
<think>好的,我需要解决用户在Trino或Presto中使用SHOW CREATETABLE命令时出现的中文乱码问题。首先,我得了解这个问题的根源。根据用户提供的引用信息,特别是引用[2],提到Presto的注释不支持中文,非ASCII字符会返回Unicode编码。这可能是因为Trino/Presto在存储或读取元数据时没有正确设置字符编码,导致中文字符无法正确显示。接下来,我需要参考已有的解决方案。例如,在Hive中,用户通过修改表的列字符集为utf8来解决乱码问题,如引用[1]中的SQL语句。但Trino/Presto的元数据存储可能与Hive不同,可能需要调整数据库的字符集设置。比如,如果Trino连接到MySQL作为元数据存储,可能需要确保MySQL的字符集为utf8mb4,这样能支持更广泛的Unicode字符,包括中文。另外,用户提到引用[3]中关于Trino列下推的问题,虽然主要讨论存储格式,但这也提醒我需要检查表的存储格式是否影响了字符编码。不过,乱码问题更可能出现在元数据存储层面,而不是数据存储格式。因此,重点应放在元数据库的配置上。可能的解决方案包括检查并修改元数据库的字符集,例如MySQL中的相关表使用utf8mb4。同时,确保Trino的JDBC连接字符串中指定了正确的字符编码,如添加useUnicode=truecharacterEncoding=UTF-8参数。此外,升级Trino到新版本可能修复已知的字符编码问题,如引用[2]提到的社区讨论中的进展。 还需要考虑客户端工具的编码设置,如终端或SQL客户端是否支持UTF-8。如果客户端编码不正确,即使服务端正确处理了中文,显示时仍可能出现乱码。因此,用户需要检查客户端的配置,确保其使用UTF-8编码。 总结下来,解决步骤可能包括:1.检查并修改元数据库的字符集配置;2.调整Trino的连接参数;3.升级Trino版本;4.验证客户端工具的编码设置。需要逐一排查这些方面,找到具体导致乱码的原因,并针对性地解决。</think>### Trino/Presto中解决SHOW CREATE TABLE中文乱码的解决方案 #### 1. **元数据库字符集配置** 若Trino/Presto使用MySQL作为元数据存储,需确保相关表的字符集为`utf8mb4`: ```sql ALTER TABLE `表名` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 例如,修改`TABLE_COMMENTS`表的字符集: ```sql ALTER TABLE `TABLE_COMMENTS` MODIFY COLUMN `COMMENT` VARCHAR(4096) CHARACTER SET utf8mb4; ``` 此操作确保元数据支持中文存储[^1][^2]。 #### 2. **Trino连接参数调整** 在Trino的MySQL连接配置中增加编码参数: ```properties connector.name=mysql connection-url=jdbc:mysql://host:3306/metastore?useUnicode=true&characterEncoding=UTF-8 ``` 通过`useUnicode=true``characterEncoding=UTF-8`强制使用UTF-8编码传输数据[^2]。 #### 3. **升级Trino版本** 社区从**Trino 368版本**开始逐步修复中文注释支持问题(参考[GitHub Issue #5061](https://github.com/trinodb/trino/issues/5061))。建议升级至最新稳定版验证问题是否已修复[^2]。 #### 4. **客户端编码验证** 确保执行命令的终端或工具(如DBeaver、命令行)使用UTF-8编码: - **Linux/Mac终端**:设置`LANG=en_US.UTF-8` - **Windows PowerShell**:执行`chcp 65001`切换为UTF-8代码页 - **SQL客户端**:在连接配置中明确指定字符集为UTF-8。 #### 5. **临时解决方案:手动转码** 若仍无法解决,可通过`HEX`函数解析编码后手动转换: ```sql SELECT COMMENT, FROM_HEX(REPLACE(HEX(COMMENT), '00', '')) AS decoded_comment FROM system.metadata.table_comments WHERE table_name = '表名'; ``` 此方法适用于调试,但需二次处理数据[^2]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硅谷工具人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值