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')