Firebird数据库
Firebird数据库语言参考-数据类型转换
2016-05-24 15:09:10

 

在编写一个表达式或指定一个操作,目标应该使用兼容的数据类型对于操作数。当需要使用混合的数据类型发生时,它提示应该寻找一种方式转换不兼容的操作数在对它们进行操作之前。转换数据的能力很可能是一个问题,如果你正在与方言1数据。

 

显式数据类型转换

 

CAST 函数使许多成对的数据类型之间显式转换。

 

语法:

 




 

 

当你转换到域时,声明它的的任何约束都被考虑在内,即NOT NULL或CHECK约束。如果在<value>没有通过检查,转换将失败。

 

如果另外指定了TYPE OF强制转换为其基类型,那么转换时任何域约束被忽略,如果TYPE OF同字符类型 (CHAR/VARCHAR) 一起使用,将保留的字符集和排序规则。

 

 

当操作数强制转换为列的类型时,指定的列可以来自一个表或一个视图。

 

只有列本身的类型被使用。对于字符类型,转换还包括字符集,但不是排序。源列的约束和默认值并不适用。

 

例如:

 

           CREATE TABLE TTT (
                   S VARCHAR (40)
                   CHARACTER SET UTF8 COLLATE UNICODE_CI_AI);
           COMMIT;

 

           SELECT
                  CAST ('I have many friends' AS TYPE OF COLUMN TTT.S)
           FROM RDB$DATABASE;

 


表3.6. 用CAST转换

 

 

 

 


 

要转换的字符串数据类型为日期、 时间戳数据类型,需要字符串参数为预定义的日期和时间文本之一(见表 3.7)或日期表示形式为被允许的日期时间文本格式之一:

 

              <datetime_literal> ::= {
                  [YYYY<p>]MM<p>DD[<p>HH[<p>mm[<p>SS[<p>NNNN]]]] |
                  MM<p>DD[<p>YYYY[<p>HH[<p>mm[<p>SS[<p>NNNN]]]]] |
                  DD<p>MM[<p>YYYY[<p>HH[<p>mm[<p>SS[<p>NNNN]]]]] |
                  MM<p>DD[<p>YY[<p>HH[<p>mm[<p>SS[<p>NNNN]]]]] |
                  DD<p>MM[<p>YY[<p>HH[<p>mm[<p>SS[<p>NNNN]]]]] |
                  NOW |
                  TODAY |
                  TOMORROW |
                  YESTERDAY
               }

 

              <date_literal> ::= {
                  [YYYY<p>]MM<p>DD |
                  MM<p>DD[<p>YYYY] |
                  DD<p>MM[<p>YYYY] |
                  MM<p>DD[<p>YY] |
                  DD<p>MM[<p>YY] |
                  TODAY |
                  TOMORROW |
                  YESTERDAY
                }

 

               <time_literal> := HH[<p>mm[<p>SS[<p>NNNN]]]
                   <p> ::= whitespace | . | : | , | - | /

 

表 3.7. 日期时间文本格式参数

 

 

表3.8. 日期和时间有预定义值的文本

 

 

 

 

示例日期字面解释:

 

             select
                cast('04.12.2014' as date) as d1, -- DD.MM.YYYY
                cast('04 12 2014' as date) as d2, -- MM DD YYYY
                cast('4-12-2014' as date) as d3, -- MM-DD-YYYY
                cast('04/12/2014' as date) as d4, -- MM/DD/YYYY
                cast('04,12,2014' as date) as d5, -- MM,DD,YYYY
                cast('04.12.14' as date) as d6, -- DD.MM.YY
                -- DD.MM with current year
                cast('04.12' as date) as d7,
                -- MM/DD with current year
                cast('04/12' as date) as d8,
                cast('2014/12/04' as date) as d9, -- YYYY/MM/DD
                cast('2014 12 04' as date) as d10, -- YYYY MM DD
                cast('2014.12.04' as date) as d11, -- YYYY.MM.DD
                cast('2014-12-04' as date) as d12, -- YYYY-MM-DD
                cast('4 Jan 2014' as date) as d13, -- DD MM YYYY
                cast('2014 Jan 4' as date) as dt14, -- YYYY MM DD
                cast('Jan 4, 2014' as date) as dt15, -- MM DD, YYYY
                cast('11:37' as time) as t1, -- HH:mm
                cast('11:37:12' as time) as t2, -- HH:mm:ss
                cast('11:31:12.1234' as time) as t3, -- HH:mm:ss.nnnn
                cast('11.37.12' as time) as t4, -- HH.mm.ss
                -- DD.MM.YYYY HH:mm
                cast('04.12.2014 11:37' as timestamp) as dt1,
                -- MM/DD/YYYY HH:mm:ss
                cast('04/12/2014 11:37:12' as timestamp) as dt2,
                -- DD.MM.YYYY HH:mm:ss.nnnn
                cast('04.12.2014 11:31:12.1234' as timestamp) as dt3,
                -- MM/DD/YYYY HH.mm.ss
                cast('04/12/2014 11.37.12' as timestamp) as dt4
             from rdb$database

 

 

Firebird数据库允许一种简写"C-style"类型语法用于从字符串转换为日期,时间和时间戳类型。

 

语法:

 

        data_type 'date_literal_string'

 

例子:

 

-- 1
          UPDATE PEOPLE
               SET AGECAT = 'SENIOR'
         WHERE BIRTHDATE < DATE '1-Jan-1943';

 

-- 2
         INSERT INTO APPOINTMENTS
             (EMPLOYEE_ID, CLIENT_ID, APP_DATE, APP_TIME)
         VALUES (973, 8804, DATE 'today' + 2, TIME '16:00');

 

-- 3

         NEW.LASTMOD = TIMESTAMP 'now';