presto和hive字符串常用函数

本文介绍了SQL中常用的字符串操作函数,包括截取、连接、定位、分割等操作,并提供了实际应用场景的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

substr字符串截取

从第二个字符开始,截到最后

select substr('12345678',2)   -- 返回 '2345678' 

从第二个开始,截取3个字符

select substr('12345678',2,3)  --  返回234

concat 连接字符串

可以连接不同类型返回abcd1234

select concat('abcd',1234) 

计算百分比

select concat(round(gmv/total_gmv*2*100,2),'%') as `gmv占比`

指定连接符连接

select concat_ws(',','12','ab','cd') -- '12,ab,cd'

locate 字符串定位

返回第一个字符串出现的位置,从1开始

select locate('a', 'abcdabcd') -- 返回1

找不到时返回0

select locate('e', 'abcdabcd') -- 返回0

定位问号

select locate('?', 'ab?dabcd') -- 返回3

split分割

按逗号分隔,返回array数组

select split('1,2,3',',') 

取数组的第1个元素

select split('1,2,3',',')[0] 

trim删除空格

删除字符串前后空格

select trim('   abc   ') -- 返回'abc'

只删除左侧空格

select ltrim('   abc   ') -- 返回 'abc   '

只删除右侧空格

select rtrim('   abc   ') -- 返回 '   abc'

reverse 反转

反转字符串

select reverse('1234') -- 返回 '4321'
replace 替换函数

将prime替换为空字符串,相当于删除prime

select replace('prime123','prime','') 

length 返回长度

返回字符串长度

select length('1234') -- 返回长度,4
cast 类型转换

将整数类型转换为字符串

select cast(1 as string)

rpad 右侧填充

字符串长度设置为10,不足的地方在右侧填充星号

select rpad('123',10,'*') --  返回123*******

字符串长度设置为10,不足的地方在左侧填充星号

select lpad('123',10,'*')  左侧填充,返回*******123
<think>我们正在处理一个PrestoSQL查询问题:如何从字符串格式的日期字段中提取月份?根据引用[1],我们知道在Hive中有字符串转日期的方法,但Presto有自己的函数。引用[3]提到了Presto字符串截取函数substr,但这里我们不需要截取,因为日期格式可能不固定,最好先转换成日期类型再提取月份。引用[4][5]提到了Presto的json函数,但我们的问题与json无关,是关于日期字符串的。在Presto中,处理日期字符串的常见步骤是:1.将字符串转换为日期类型(如date或timestamp)2.使用日期函数提取月份部分。但是,如果字符串的格式不是标准的,我们可能需要先进行格式化。Presto提供了`date_parse`函数字符串转换为日期,然后使用`month`函数提取月份。例如,假设我们有一个字符串日期字段`date_str`,格式为'2023-07-25',我们可以这样做:SELECTmonth(date_parse(date_str,'%Y-%m-%d'))ASmonth如果格式不同,比如'25/07/2023',则格式字符串应为'%d/%m/%Y'。但是,如果字符串已经是ISO格式(如'2023-07-25'),我们也可以直接使用`date`函数转换为日期,然后再提取月份:SELECTmonth(cast(date_strasdate))ASmonth或者更简洁地,使用`extract`函数:SELECTextract(monthfromdate_parse(date_str,'%Y-%m-%d'))ASmonth或者对于ISO格式:SELECTextract(monthfromcast(date_strasdate))ASmonth因此,具体方法取决于字符串的格式。由于用户没有提供具体的日期字符串格式,我们可以给出一个通用的方法,并假设几种常见格式。步骤:1.确定日期字符串的格式(例如:'YYYY-MM-DD','MM/DD/YYYY','DD-MM-YYYY'等)。2.使用`date_parse`函数字符串按照对应的格式转换为日期类型。3.使用`extract`函数提取月份。示例:格式为'YYYY-MM-DD':SELECTextract(monthfromdate_parse('2023-07-25','%Y-%m-%d'))ASmonth--结果:7格式为'MM/DD/YYYY':SELECTextract(monthfromdate_parse('07/25/2023','%m/%d/%Y'))ASmonth--结果:7注意:`date_parse`的格式说明符与MySQL的类似,常用如下:%Y:四位年份%m:两位月份(01-12)%d:两位日期(01-31)%H:小时(00-23)%i:分钟(00-59)%s:秒(00-59)如果日期字符串中包含时间部分,同样可以使用`date_parse`,它会转换为timestamp,然后提取月份也是同样的方式。另外,如果字符串已经是Presto能识别的标准格式(如'2023-07-25'),也可以直接使用`cast`转换为date类型,然后提取月份:SELECTextract(monthfromcast('2023-07-25'asdate))ASmonth但是,如果格式不是标准的,则必须使用`date_parse`并指定格式。因此,建议用户先确认日期字符串的格式,然后选择相应的转换方式。如果用户不确定格式,或者有多种格式,可能需要先进行标准化处理,或者尝试多种格式转换(但Presto没有像其他数据库那样的自动转换函数,所以必须明确格式)。综上所述,在Presto中从字符串日期提取月份的方法如下:1.使用`date_parse`函数字符串按照指定格式转换为timestamp(或date)。2.使用`extract(monthfrom...)`提取月份。示例代码:SELECTextract(monthfromdate_parse(your_date_column,'你的格式'))ASmonthFROMyour_table注意:如果字符串中包含时间,提取的月份仍然是日期部分的月份。如果用户需要的是月份的数字(1到12),那么上述方法即可。另外,如果用户需要月份的名称(如'July'),则可以使用`date_format`函数:SELECTdate_format(date_parse('2023-07-25','%Y-%m-%d'),'%M')ASmonth_name--结果:'July'但问题要求提取月份,通常指的是数字,所以用`extract`即可。根据引用[1]中关于Hive字符串转日期的多种格式,我们可以提醒用户注意格式匹配的重要性。因此,回答如下:</think>### 在 Presto 中从字符串日期提取月份的方法 在 Presto 中从字符串格式的日期字段提取月份,核心是通过**日期解析函数****时间提取函数**的组合实现。以下是详细步骤: #### 方法 1:使用 `date_parse` + `extract`(推荐) ```sql SELECT extract(MONTH FROM date_parse(your_date_column, '格式字符串')) AS month FROM your_table ``` **参数说明**: - `your_date_column`:包含日期字符串的字段名 - `格式字符串`:根据实际字符串格式匹配(常见格式见下表) | 日期字符串格式 | 格式字符串 | 示例 | |---------------------|------------------|------------------------------| | `'2023-07-25'` | `'%Y-%m-%d'` | `date_parse('2023-07-25', '%Y-%m-%d')` | | `'25/07/2023'` | `'%d/%m/%Y'` | `date_parse('25/07/2023', '%d/%m/%Y')` | | `'20230725'` | `'%Y%m%d'` | `date_parse('20230725', '%Y%m%d')` | | `'Jul 25, 2023'` | `'%b %d, %Y'` | `date_parse('Jul 25, 2023', '%b %d, %Y')` | **示例**: ```sql -- 从 '2023-07-25' 提取月份(返回 7) SELECT extract(MONTH FROM date_parse('2023-07-25', '%Y-%m-%d')) -- 从 '25/07/2023' 提取月份(返回 7) SELECT extract(MONTH FROM date_parse('25/07/2023', '%d/%m/%Y')) ``` #### 方法 2:使用 `substr` 直接截取(适用于固定格式) 若日期字符串格式严格固定(如始终为 `YYYY-MM-DD`),可直接截取月份部分: ```sql SELECT CAST(substr(your_date_column, 6, 2) AS INTEGER) AS month FROM your_table ``` **说明**: - `substr(字段, 开始位置, 长度)`:截取子字符串(位置从 1 开始计数) - 此方法效率较高,但**仅适用于格式完全统一**的场景 #### 注意事项 1. **格式匹配**:`date_parse` 的格式字符串必须与原始字符串严格匹配,否则返回 `NULL` 2. **时区处理**:若字符串含时区信息(如 `2023-07-25 08:00:00 UTC`),需在格式字符串中添加 `'%T %Z'` 3. **异常处理**:建议用 `TRY` 防止解析失败: ```sql SELECT TRY(extract(MONTH FROM date_parse(date_str, format))) ``` #### 完整示例 假设表 `sales` 有字符串日期字段 `order_date`(格式 `YYYY-MM-DD`): ```sql SELECT order_date, extract(MONTH FROM date_parse(order_date, '%Y-%m-%d')) AS month_num, date_format(date_parse(order_date, '%Y-%m-%d'), '%M') AS month_name FROM sales ``` **输出**: | order_date | month_num | month_name | |-------------|-----------|------------| | 2023-07-25 | 7 | July | | 2023-12-01 | 12 | December | > **提示**:使用 `date_format` 可提取月份名称(如 `July`),而 `extract` 返回月份数字[^1][^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值