postgre To Mysql 迁移小结

greemplum的计算内核是postgresql,所有下面总结的几点也适用于mysql迁移到postgresql

1、时间格式化

mysql: select DATE_FORMAT(now(),'%Y%m%d%H%i%s') =>20160720035809 获取一个日期的年月日小时分钟秒字符串 注:%H表示24小时制

GP:  to_char(now(), 'YYYYMMDDHH24MISS') =>20160720155848获取一个日期的年月日小时分钟秒字符串类型

    to_date(now(), 'YYYYMMDD') =>20160720155848获取一个日期的年月日小时分钟秒日期类型

    to_number(now(),'9999999999')=>20160702获取一个日期的年月日数值类型

    to_number(now(),'9999999999999999999')=>20160720155848获取一个日期的年月日小时分钟秒数值类型      

 注:HH24表示24小时制

数值类型转换时间类型

mysql:select cast(20160501 as datetime)=>2016-05-01 00:00:00

    select cast(20160501 as date)=>2016-05-01

GP: select to_timestamp('20160801','YYYYMMDDHH24MISS')=>2016-08-01 00:00:00+08

   select 20160801::varchar::TIMESTAMP=>2016-08-01 00:00:00+08

   select to_date('20160801','YYYYMMDDHH24MISS')=>2016-08-01

   select 20160801::varchar::date=>2016-08-01


GP详细时间函数可见http://blog.csdn.net/snn1410/article/details/7741283

获取小时函数

mysql: select hour(now())=>16 获取一个日期的小时

GP:   select EXTRACT(HOUR from now()) =>16 获取一个日期的小时

GP衍生:

select EXTRACT(day from now()) 日期

select EXTRACT(dow from now()) 每周的星期号

select EXTRACT(doy from now()) 一年的第几天

select EXTRACT(month from now())月份

select EXTRACT(minute from now())分钟

select EXTRACT(week from now())一年的第几周

select EXTRACT(year from now())年份

时间计算

mysql :DATE_SUB(now(),INTERVAL 5 day) 5天前  DATE_SUB(now(),INTERVAL -5 day)5天后

GP:now()-INTERVAL '5 day' 5天前  now()+INTERVAL '5 day' 5天后

  now()-INTERVAL '5 year' 5年前

  now()-INTERVAL '5 month' 5个月前

  now()-INTERVAL '5 min' 5分钟前

注:上述的DATE_SUB函数中的5这个值可以是变量,比如case when a=1 then 5 else 0

但是如果GP要实现这样的功能需要换一种写法,比如select now()-  (case when a=1 then '5' else '0' end || ' day')::INTERVAL实现当a=1的时候减5天,其他值则时间为当前时间


时间差

mysql:DATEDIFF(b.pay_time,c.value_date)

GP:  (b.pay_time::date-c.value_date::date)

2、lfnull处理空字符串

mysql: ifnull(null,0.00) =>0.00 字段如果为空则为0.00

GP:  COALESCE(null,0.00 )=>0.00 字段如果为空则为0.00

注意:COALESCE中的两个数据类型要一致COALESCE(1,'a')会报错,mysql的ifnull则不会

3、字符串拼接

mysql: SELECT concat('My','S','QL') =>MySQL

GP:   SELECT 'My'||'S'||'QL'   =>   MySQL

4、执行存储过程

mysql: call proc_test();

GP:   select proc_test();

5、substr和substring

substr(str from pos)和substring(str from pos)都可以使用

GP不能使用substr(str from pos) 只能substring(str from pos)

6、convert函数差异

mysql convert函数可用来强制转换数据类型例:convert('20160801',date)=>2016-08-01

postgresql convert则是用来用转换字符集类型 convert_to(string text, dest_encoding name) 

7、GP不能将字符字段改成数值类型

8、GP不能使用if函数

mysql:if(a=1,b=1,b=2)=>如果a=1则b=1否则b=2

GP:  只能用case when a=1 then b=1 else b=2 end实现,也可以自定义函数实现mysql的if函数功能 

9、locate函数获取某个字符串在一个字符串中的位置

mysql:locate('a','bcad')=>3

GP:  position('a' in'bcad')=>3

10、create table

mysql:create table t1 select * from t2;

GP   create table t1 as select * from t2; GP必须加上as

11、联合更新

mysql:update CDM.cdm_product a INNER JOIN dim_product_tmp b  on a.id = b.id

set a.enddate = b._date,a.is_current = 0 

GP:update CDM.cdm_product a set enddate = b._date,is_current = 0 from dim_product_tmp b where a.id = b.id;  GPupdate允许子查询,注意enddate = b._date不能写成a.enddate = b._date

12、主键自增

mysql:CREATE TABLE `cdm_product` (`id` int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`))) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

GP: CREATE TABLE "cdm"."cdm_product" ("id" SERIAL primary key)

13、

mysql:insert into value()

GP  :insert into values()

14、聚集函数

mysql:GROUP_CONCAT(date_day ORDER BY date_day asc separator ',')

GP  :array_to_string(ARRAY(SELECT unnest(array_agg(date_day)) order by 1),',')

15、从表中获取数据给变量赋值

mysql:SELECT @min_date:=min(DATE_FORMAT(u.create_date, '%Y%m%d'))    FROM `ODS`.ods_sys_user u;

GP  :SELECT min(to_number(u.create_date, '9999999999')) into min_date    FROM ODS.ods_sys_user u;

16、创建临时表

mysql:create TEMPORARY table product select

GP  :create TEMPORARY table product as select

17、join on 和 using

USING 是个一个连接条件的缩写语法:它接收一个用逗号分隔的字段名列表,这些字段必须是连接表共有的并且其值必须相同。最后,JOIN USING 会将每一对相等的输入字段输出为一个字段,其后跟着所有其它字段。因此,USING (a, b, c) 等效于 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) 只不过是如果使用了 ON ,那么在结果里 a, b, c 字段都会有两个,而用 USING 的时候就只会有一个。

18、\除法运算

mysql:select 250/999 =>0.2503结果保留到4位小数,被除数如果是0则返回null   

GP  :select 250/999  =>0,select 2500/999  =>2结果只保留整数,被除数如果是0则报错ERROR:  division by zero

           如果要保留小数需要int类型转换成numeric类型:select round(250::numeric/999::numeric,4)=>0.2503

常见问题:[Err] ERROR:  mismatched parentheses 不匹配的括号,检查是否确实左右括号

       GP不同数据类型不会做隐式转换,一定要显示转换

       GP列名不允许出现特殊字符

--------------------------------------------------------------------------------------------------------------------------------------------------------------

实际操作:

1.insert into 表名 values (),mysql仍支持

2.to_char  换成 date_format

 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。

DATE_FORMAT(date,format)

format参数的格式有


%a缩写星期名

%b缩写月名

%c月,数值

%D带有英文前缀的月中的天

%d月的天,数值(00-31)

%e月的天,数值(0-31)

%f微秒

%H小时 (00-23)

%h小时 (01-12)

%I小时 (01-12)

%i分钟,数值(00-59)

%j年的天 (001-366)

%k小时 (0-23)

%l小时 (1-12)

%M月名

%m月,数值(00-12)

%pAM 或 PM

%r时间,12-小时(hh:mm:ss AM 或 PM)

%S秒(00-59)

%s秒(00-59)

%T时间, 24-小时 (hh:mm:ss)

%U周 (00-53) 星期日是一周的第一天

%u周 (00-53) 星期一是一周的第一天

%V周 (01-53) 星期日是一周的第一天,与 %X 使用

%v周 (01-53) 星期一是一周的第一天,与 %x 使用

%W星期名

%w周的天 (0=星期日, 6=星期六)

%X年,其中的星期日是周的第一天,4 位,与 %V 使用

%x年,其中的星期一是周的第一天,4 位,与 %v 使用

%Y年,4 位

%y年,2 位

3.                  换成 timestampdiff(second,'2000-01-01 00:00:00','2000-01-02 00:00:00')

4.cast(substring('V1.20180303',2,position('.' in 'V1.20180303')-2) as integer ) 改为 cast(substr('V1.20180303',2,position('.' in 'V1.20180303')-2) as SIGNED)

但是要特别注意,MYSQL可以转换的数据类型是有限制的。这个类型可以是以下值其中的一个:

二进制,同带binary前缀的效果 : BINARY

字符型,可带参数 : CHAR()

日期 : DATE

时间: TIME

日期时间型 : DATETIME

浮点数 : DECIMAL

整数 : SIGNED

无符号整数 : UNSIGNED

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容