[关闭]
@lumincinta 2017-01-30T14:41:28.000000Z 字数 8569 阅读 369

DB2中字符、数字和日期类型之间的转换

DB2 SQL


一般我们在使用DB2或Oracle的过程中,经常会在数值<->字符<->日期三种类型之间做转换,那么在DB2和Oracle中,他们分别是如何实现的呢?在Oracle这几个类型之间的转换是十分方便的,通过to_char|to_date|to_number函数即可完成类型转换。本小节主要介绍DB2中的一些知识,从Oracle转过来的DBA或开发人员,可以对比着学习。

字符型到日期时间型的互换

字符型 日期时间型 转换函数
char date date(col_a)
char time time(col_a)
char timestamp timestamp(col_a) 或者 to_date(--string-expression,format-string)

注:to_date实际是TIMESTAMP_FORMAT函数的一个同义词

日期时间型 字符型 转换
date char char(col_a)
time char char(col_a)
timestamp char char(col_a) 或 to_char(--timestamp-expression--,format-string--)

注:to_char实际是VARCHAR_FORMAT函数的一个同义词

字符型到数值型的转换

字符型 数值型 转换函数
char smallint Integer(col_a)
char integer Integer(col_a)
char bigint cast(col_a as bigint)
char decimal cast(col_a as decimal(8,2))
char double cast(cast(char(cast(col_a as decimal(8,2))) as decimal(8,2)) as double)

数值型到字符型的转换

数值型 字符型 转换函数
smallint char char(col_a)
integer char char(col_a)
bigint char char(col_a)
double char char(cast(col_a AS decimal(8,2)))
decimal(8,2) char Digits(col_a)

测试一下:

字符型和日期时间型的互换

测试1 "Human Readable Format" -> "DB2 Interal Format"

  1. describe
  2. select date('2009-09-01 '),
  3. date('09/27/2009 '),
  4. time('12:23:34 '),
  5. timestamp('2009-02-26-14.28.40.234000 ')
  6. from sysibm.dual;
  7. select date('2009-09-01 '),
  8. date('09/27/2009 '),
  9. time('12:23:34 '),
  10. timestamp('2009-02-26-14.28.40.234000 ')
  11. from sysibm.dual;

结果1

  1. describe
  2. select date('2009-09-01 '),
  3. date('09/27/2009 '),
  4. time('12:23:34 '),
  5. timestamp('2009-02-26-14.28.40.234000 ')
  6. from sysibm.dual;
  7. completed successfully.
  8. 列信息
  9. 列数:4
  10. SQL 类型 类型长度 列名 名称长度
  11. -------------------- ----------- ------------------------------ -----------
  12. 384 DATE 10 1 1
  13. 384 DATE 10 2 1
  14. 388 TIME 8 3 1
  15. 392 TIMESTAMP 26 4 1
  16. Statement processed successfully in 0.08 secs.
  17. select date('2009-09-01 '),
  18. date('09/27/2009 '),
  19. time('12:23:34 '),
  20. timestamp('2009-02-26-14.28.40.234000 ')
  21. from sysibm.dual;
  22. completed successfully.
  23. 1 row selected in 0.01 secs.
  24. 1 2 3 4
  25. ---------- ---------- -------- -------------------
  26. 2009-09-01 2009-09-27 12:23:34 2009-02-26 14:28:40

测试2

  1. describe
  2. select to_date('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss'),
  3. timestamp_format('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss'),
  4. timestamp_format('2009-02-26 ','yyyymmdd'),
  5. timestamp_format('14.28.40 ','hh24:mi:ss')
  6. from sysibm.dual;
  7. select to_date('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss'),
  8. timestamp_format('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss'),
  9. timestamp_format('2009-02-26 ','yyyymmdd'),
  10. timestamp_format('14.28.40 ','hh24:mi:ss')
  11. from sysibm.dual;

结果2

  1. describe
  2. select to_date('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss'),
  3. timestamp_format('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss'),
  4. timestamp_format('2009-02-26 ','yyyymmdd'),
  5. timestamp_format('14.28.40 ','hh24:mi:ss')
  6. from sysibm.dual;
  7. completed successfully.
  8. 列信息
  9. 列数:4
  10. SQL 类型 类型长度 列名 名称长度
  11. -------------------- ----------- ------------------------------ -----------
  12. 392 TIMESTAMP 26 1 1
  13. 392 TIMESTAMP 26 2 1
  14. 392 TIMESTAMP 26 3 1
  15. 392 TIMESTAMP 26 4 1
  16. Statement processed successfully in 0.07 secs.
  17. select to_date('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss'),
  18. timestamp_format('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss'),
  19. timestamp_format('2009-02-26 ','yyyymmdd'),
  20. timestamp_format('14.28.40 ','hh24:mi:ss')
  21. from sysibm.dual;
  22. completed successfully.
  23. 1 row selected in 0.01 secs.
  24. 1 2 3 4
  25. ------------------- ------------------- ------------------- -------------------
  26. 2009-01-01 12:23:45 2009-01-01 12:23:45 2009-02-26 00:00:00 2017-01-01 14:28:40

测试3

  1. describe
  2. select cast(timestamp_format('2009.02.26 ','yyyymmdd') as date),
  3. cast(timestamp_format('20090226 ','yyyymmdd') as date),
  4. cast(timestamp_format('2009/02/26 ','yyyymmdd') as date)
  5. from sysibm.dual;
  6. select cast(timestamp_format('2009.02.26 ','yyyymmdd') as date),
  7. cast(timestamp_format('20090226 ','yyyymmdd') as date),
  8. cast(timestamp_format('2009/02/26 ','yyyymmdd') as date)
  9. from sysibm.dual;

结果3

  1. describe
  2. select cast(timestamp_format('2009.02.26 ','yyyymmdd') as date),
  3. cast(timestamp_format('20090226 ','yyyymmdd') as date),
  4. cast(timestamp_format('2009/02/26 ','yyyymmdd') as date)
  5. from sysibm.dual;
  6. completed successfully.
  7. 列信息
  8. 列数:3
  9. SQL 类型 类型长度 列名 名称长度
  10. -------------------- ----------- ------------------------------ -----------
  11. 384 DATE 10 1 1
  12. 384 DATE 10 2 1
  13. 384 DATE 10 3 1
  14. Statement processed successfully in 0.06 secs.
  15. select cast(timestamp_format('2009.02.26 ','yyyymmdd') as date),
  16. cast(timestamp_format('20090226 ','yyyymmdd') as date),
  17. cast(timestamp_format('2009/02/26 ','yyyymmdd') as date)
  18. from sysibm.dual;
  19. completed successfully.
  20. 1 row selected in 0.01 secs.
  21. 1 2 3
  22. ---------- ---------- ----------
  23. 2009-02-26 2009-02-26 2009-02-26

测试4

  1. describe
  2. select char(current date),
  3. char(current time),
  4. char(current timestamp),
  5. to_char(current timestamp,'yyyy-mm-dd hh24:mi:ss'),
  6. to_date('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss')
  7. from sysibm.dual;
  8. select char(current date),
  9. char(current time),
  10. char(current timestamp),
  11. to_char(current timestamp,'yyyy-mm-dd hh24:mi:ss'),
  12. to_date('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss')
  13. from sysibm.dual;

结果4

  1. describe
  2. select char(current date),
  3. char(current time),
  4. char(current timestamp),
  5. to_char(current timestamp,'yyyy-mm-dd hh24:mi:ss'),
  6. to_date('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss')
  7. from sysibm.dual;
  8. completed successfully.
  9. 列信息
  10. 列数:5
  11. SQL 类型 类型长度 列名 名称长度
  12. -------------------- ----------- ------------------------------ -----------
  13. 452 CHARACTER 10 1 1
  14. 452 CHARACTER 8 2 1
  15. 452 CHARACTER 26 3 1
  16. 448 VARCHAR 254 4 1
  17. 392 TIMESTAMP 26 5 1
  18. Statement processed successfully in 0.07 secs.
  19. select char(current date),
  20. char(current time),
  21. char(current timestamp),
  22. to_char(current timestamp,'yyyy-mm-dd hh24:mi:ss'),
  23. to_date('2009-01-01 12:23:45','yyyy-mm-dd hh24:mi:ss')
  24. from sysibm.dual;
  25. completed successfully.
  26. 1 row selected in 0.01 secs.
  27. 1 2 3 4 5
  28. ---------- -------- -------------------------- ------------------- -------------------
  29. 2017-01-30 22.20.25 2017-01-30-22.20.25.938000 2017-01-30 22:20:25 2009-01-01 12:23:45
字符型到数值型的转换

测试5

  1. drop table TEST_DATATYPE;
  2. create table TEST_DATATYPE
  3. (
  4. col_a char(2),
  5. col_b char(4),
  6. col_c char(10),
  7. col_d char(10),
  8. col_e char(10)
  9. );
  10. insert into TEST_DATATYPE values('1','200','30000','4000.04','5000000');
  11. describe
  12. select * from TEST_DATATYPE;
  13. describe
  14. select Integer(col_a),
  15. Integer(col_b),
  16. cast(col_c as bigint),
  17. cast(col_d as decimal(8,2)),
  18. cast(cast(char(cast(col_e as decimal(12,2))) as decimal(12,2)) as double)
  19. from TEST_DATATYPE;

结果5

  1. drop table TEST_DATATYPE;
  2. completed successfully.
  3. Statement processed successfully in 0.11 secs.
  4. create table TEST_DATATYPE
  5. (
  6. col_a char(2),
  7. col_b char(4),
  8. col_c char(10),
  9. col_d char(10),
  10. col_e char(10)
  11. );
  12. completed successfully.
  13. Statement processed successfully in 0.01 secs.
  14. insert into TEST_DATATYPE values('1','200','30000','4000.04','5000000');
  15. completed successfully.
  16. 1 row inserted in 0.00 secs.
  17. describe
  18. select * from TEST_DATATYPE;
  19. completed successfully.
  20. 列信息
  21. 列数:5
  22. SQL 类型 类型长度 列名 名称长度
  23. -------------------- ----------- ------------------------------ -----------
  24. 453 CHARACTER 2 COL_A 5
  25. 453 CHARACTER 4 COL_B 5
  26. 453 CHARACTER 10 COL_C 5
  27. 453 CHARACTER 10 COL_D 5
  28. 453 CHARACTER 10 COL_E 5
  29. Statement processed successfully in 0.08 secs.
  30. describe
  31. select Integer(col_a),
  32. Integer(col_b),
  33. cast(col_c as bigint),
  34. cast(col_d as decimal(8,2)),
  35. cast(cast(char(cast(col_e as decimal(12,2))) as decimal(12,2)) as double)
  36. from TEST_DATATYPE;
  37. completed successfully.
  38. 列信息
  39. 列数:5
  40. SQL 类型 类型长度 列名 名称长度
  41. -------------------- ----------- ------------------------------ -----------
  42. 497 INTEGER 4 1 1
  43. 497 INTEGER 4 2 1
  44. 493 BIGINT 8 3 1
  45. 485 DECIMAL 8, 2 4 1
  46. 481 DOUBLE 8 5 1
  47. Statement processed successfully in 0.08 secs.
数值型到字符型的转换

测试6

  1. drop table TEST_DATATYPE;
  2. create table TEST_DATATYPE
  3. (
  4. col_a smallint,
  5. col_b integer,
  6. col_c bigint,
  7. col_d decimal(8,2),
  8. col_e double
  9. );
  10. insert into TEST_DATATYPE values(1,20,3000,4000.44,55555);
  11. describe
  12. select * from TEST_DATATYPE;
  13. describe
  14. select char(col_a),
  15. char(col_b),
  16. char(col_c),
  17. digits(col_d),
  18. cast(col_d as decimal(8,2)),
  19. char(cast(col_e as decimal(8,2)))
  20. from TEST_DATATYPE;
  21. select char(col_a)||','||char(col_b)||','||char(col_c)||','||digits(col_d)||','||char(cast(col_e as decimal(8,2)))
  22. from TEST_DATATYPE;

结果6

  1. drop table TEST_DATATYPE;
  2. completed successfully.
  3. Statement processed successfully in 0.00 secs.
  4. create table TEST_DATATYPE
  5. (
  6. col_a smallint,
  7. col_b integer,
  8. col_c bigint,
  9. col_d decimal(8,2),
  10. col_e double
  11. );
  12. completed successfully.
  13. Statement processed successfully in 0.01 secs.
  14. insert into TEST_DATATYPE values(1,20,3000,4000.44,55555);
  15. completed successfully.
  16. 1 row inserted in 0.00 secs.
  17. describe
  18. select * from TEST_DATATYPE;
  19. completed successfully.
  20. 列信息
  21. 列数:5
  22. SQL 类型 类型长度 列名 名称长度
  23. -------------------- ----------- ------------------------------ -----------
  24. 501 SMALLINT 2 COL_A 5
  25. 497 INTEGER 4 COL_B 5
  26. 493 BIGINT 8 COL_C 5
  27. 485 DECIMAL 8, 2 COL_D 5
  28. 481 DOUBLE 8 COL_E 5
  29. Statement processed successfully in 0.07 secs.
  30. describe
  31. select char(col_a),
  32. char(col_b),
  33. char(col_c),
  34. digits(col_d),
  35. cast(col_d as decimal(8,2)),
  36. char(cast(col_e as decimal(8,2)))
  37. from TEST_DATATYPE;
  38. completed successfully.
  39. 列信息
  40. 列数:6
  41. SQL 类型 类型长度 列名 名称长度
  42. -------------------- ----------- ------------------------------ -----------
  43. 453 CHARACTER 6 1 1
  44. 453 CHARACTER 11 2 1
  45. 453 CHARACTER 20 3 1
  46. 453 CHARACTER 8 4 1
  47. 485 DECIMAL 8, 2 COL_D 5
  48. 453 CHARACTER 10 6 1
  49. Statement processed successfully in 0.08 secs.
  50. select char(col_a)||','||char(col_b)||','||char(col_c)||','||digits(col_d)||','||char(cast(col_e as decimal(8,2)))
  51. from TEST_DATATYPE;
  52. completed successfully.
  53. 1 row selected in 0.02 secs.
  54. 1
  55. -----------------------------------------------------------
  56. 1 ,20 ,3000 ,00400044,55555.00
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注