從Mysql SQL到Presto SQL


Presto官方文檔


前言

Presto SQL最大的“特點”就是:完全不同的數據類型之間不能比較,相似的數據類型一般可以比較。

例如,datevarchar完全不同,但intdoubledatetimestamp(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,支持withover等特性


數據類型

基本和關係型數據庫的類型一致,遇到問題再查閱[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')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章