Presto官方文档
前言
Presto SQL最大的“特点”就是:完全不同的数据类型之间不能比较,相似的数据类型一般可以比较。
例如,date
与varchar
完全不同,但int
和double
,date
和timestamp
(MySQL是datetime
)是相似的。
完全不同的数据类型怎么比较?答:转换为相同或相似的数据类型
举个例子
现有MySQL表t_sales_bill
,字段如下
column | type | comment |
---|---|---|
bill_id | bigint | |
total | double | 订单金额 |
sale_time | datetime | 下单时间 |
需求:找出下单时间大于2018-09-09
的所有订单
MySQL SQL:
select * from t_sales_bill where sale_time > '2018-09-09';
Presto SQL:
select * from t_sales_bill where sale_time > date('2018-09-09');
SQL
标准SQL写法,更像Oracle,支持with
,over
等特性
数据类型
基本和关系型数据库的类型一致,遇到问题再查阅[presto官方文档]
常见不同:MySQL用datetime
,Presto用timestamp
类型转换
MySQL
支持完全不同的数据类型之间的比较。如前言的例子,cast
用得少
Presto
不支持完全不同的数据类型之间的比较。如前言的例子,cast
用的很多
用法:cast(value as type)
例子:
cast('2018-09-09' as date)
or
date('2018-09-09')
cast('123456' as int)
遇到问题时,再做类型转换处理即可
一般情况下,异常信息如下(执行SQL:select 1=’1’)
日期
MySQL
-- 当前日期时间
-- 2018-09-11 10:49:09
now(),
-- 当前日期
-- 2018-09-11
curdate(),
-- 昨天日期
-- 2018-09-10
-- unit: day, month, year
curdate() - interval 1 day,
-- 日期与字符串可以比较
-- 1(true)
curdate() > '2018-09-09 12:12:12',
-- 字符串-日期
-- 2018-09-09
date('2018-09-09 12:12:12'),
-- 日期-字符串
-- 2018-09-11 10:49:09
date_format(now(), '%Y-%m-%d %H:%i:%s')
Presto
-- 当前日期时间
-- 2018-09-11 10:49:09
now(),
-- 当前日期
-- 2018-09-11
current_date,
-- 昨天日期
-- 2018-09-10
-- 注意数量是字符串, unit: day, month, year
current_date - interval '1' day,
-- 日期类型不能与字符串比较,运行错误,需要显式转换
-- current_date > '2018-09-09',
current_date > date('2018-09-09'),
-- 字符串-日期
-- 2018-09-09 12:12:12
date_parse('2018-09-09 12:12:12', '%Y-%m-%d %H:%i:%s'),
-- 2018-09-09
cast('2018-09-09' as date),
-- 2018-09-09 12:12:12
cast('2018-09-09 12:12:12' as timestamp),
-- 日期-字符串
-- 2018-09-11 10:49:09
date_format(now(), '%Y-%m-%d %H:%i:%s')