第二十二章 SQL函数 CAST(一)

2022-01-13  本文已影响0人  Cache技术分享

[toc]

第二十二章 SQL函数 CAST(一)

将给定表达式转换为指定数据类型的函数。

大纲

CAST(expr AS CHAR | CHARACTER | VARCHAR | NCHAR | NVARCHAR)
CAST(expr AS CHAR(n) | CHARACTER(n) | VARCHAR(n) )
CAST(expr AS CHAR VARYING | CHARACTER VARYING)
CAST(expr AS INT | INTEGER | BIGINT | SMALLINT | TINYINT)
CAST(expr AS DEC | DECIMAL | NUMERIC)
CAST(expr AS DEC(p[,s]) | DECIMAL(p[,s]) | NUMERIC(p[,s]) )
CAST(expr AS DOUBLE)
CAST(expr AS MONEY | SMALLMONEY)
CAST(expr AS DATE)
CAST(expr AS TIME)
CAST(expr AS POSIXTIME)
CAST(expr AS TIMESTAMP | DATETIME | SMALLDATETIME)
CAST(expr AS BIT)
CAST(expr AS BINARY | BINARY VARYING | VARBINARY)
CAST(expr AS BINARY(n) | BINARY VARYING(n) | VARBINARY(n) )
CAST(expr AS GUID)

参数

描述

SQL CAST函数将表达式的数据类型转换为指定的数据类型。当Expr的数据类型是标准数据类型或标准数据类型(如%Library.String%Library.Time%Library.Date%Library.TimeStamp)的子类时,CAST可以转换该数据类型。

可以将expr转换为以下任何数据类型

转换数字

数值可以转换为数字数据类型或字符数据类型。

当将数值结果转换为缩略值时,数值将被截断,而不是四舍五入。例如,将98.765转换为INT返回98,转换为CHAR返回9,转换为CHAR(4)返回98.7。请注意,将负数转换为CHAR仅返回负号,将小数转换为CHAR仅返回小数点。

数字可以由数字09、小数点、一个或多个前导符号(+-)、指数符号(EE)后面最多跟一个+-符号组成。
数字不能包含组分隔符(逗号)。

在执行强制转换之前 SQL将数字解析为其规范形式:执行指数运算。
IRIS带前导和后导零、前导加号和后导小数点。
在转换数字之前解析多个符号。
然而,SQL将双负号作为注释指示符;
遇到数字中的双负号时,会将该行代码的其余部分作为注释处理。

浮点数可以采用DECDECIMALNUMERIC数据类型。
DOUBLE数据类型根据IEEE浮点标准表示浮点数。
浮点数据类型比DOUBLE数据类型具有更高的精度,适合于大多数应用程序。
不能使用CAST将浮点数转换为DOUBLE数据类型;
相反,使用ObjectScript $DOUBLE函数。

当数字值被转换为日期或时间数据类型时,它在SQL中显示为0 (0);
但是,当将数字转换为日期或时间时,从嵌入式SQL传递到ObjectScript,它显示为相应的$HOROLOG值。

字符串类型转换

可以将字符串强制转换为另一种字符数据类型,返回单个字符、前n个字符或整个字符串。

在执行强制转换之前,SQL会解析内嵌的引号字符('can' t'=can't)和字符串连接('can'||'not'=cannot)。
保留前导和尾随空格。

当字符串被转换为数字类型时,它总是返回一个数字零(0)。

转换为DATE、TIME和TIMESTAMP

可以将字符串强制转换为DATETIMETIMESTAMP数据类型。
通过以下操作,可以得到一个有效的值:

将添加月和日字段中缺少的前导零。此转换的显示方式取决于显示模式和区域设置的日期显示格式。例如,‘2004-11-23’可能显示为‘11/23/2004’。在嵌入式SQL中,此强制转换作为相应的$HOROLOG日期整数返回。无效的ODBC日期或非数字字符串在转换为日期时在逻辑模式下表示为0;日期0显示为1840-12-31

转换NULL和空字符串

NULL可以转换为任何数据类型并返回NULL

空字符串(")的类型转换如下:

转换日期

可以将日期转换为日期数据类型、数字数据类型或字符数据类型。

将日期转换为POSIXTIME数据类型会将时间戳转换为编码的64位带符号整数。
由于日期没有时间部分,时间部分被提供给时间戳编码为00:00:00
CAST执行日期验证;
如果expr值不是有效日期,则会发出SQLCODE -400错误。

将日期转换为TIMESTAMPDATETIMESMALLDATETIME数据类型将返回一个格式为YYYY-MM-DD hh:mm:ss的时间戳。
由于日期没有时间部分,因此生成的时间戳的时间部分总是00:00:00
CAST执行日期验证;
如果expr值不是有效日期,则会发出SQLCODE -400错误。

下面的动态SQL示例将DATE数据类型字段转换为TIMESTAMPPOSIXTIME:

ClassMethod Cast()
{
    s myquery = 2
    s myquery(1) = "SELECT TOP 5 DOB,CAST(DOB AS TIMESTAMP) AS TStamp,"
    s myquery(2) = "CAST(DOB AS POSIXTIME) AS Posix FROM Sample.Person"
    s tStatement = ##class(%SQL.Statement).%New()
    s qStatus = tStatement.%Prepare(.myquery)
    if qStatus '= 1 {
        w "%Prepare failed:" 
        d $System.Status.DisplayError(qStatus) 
        q
    }
    s rset = tStatement.%Execute()
    d rset.%Display()
    w !,"End of data"
}
d ##class(PHA.Test).Cast()
DOB TStamp  Posix
1976-03-01  1976-03-01 00:00:00 1976-03-01 00:00:00
2008-07-25  2008-07-25 00:00:00 2008-07-25 00:00:00
1976-03-30  1976-03-30 00:00:00 1976-03-30 00:00:00
1961-07-29  1961-07-29 00:00:00 1961-07-29 00:00:00
1924-03-10  1924-03-10 00:00:00 1924-03-10 00:00:00

5 Rows(s) Affected
End of data

注:IRIS以下不可用POSIXTIME

下面的动态SQL示例将TIMESTAMP数据类型字段转换为DATEPOSIXTIME:

ClassMethod Cast1()
{
    s myquery = 2
    s myquery(1) = "SELECT TOP 5 EventDate,CAST(EventDate AS DATE) AS Horolog,"
    s myquery(2) = "CAST(EventDate AS POSIXTIME) AS Posix FROM Aviation.Event"
    s tStatement = ##class(%SQL.Statement).%New()
    s qStatus = tStatement.%Prepare(.myquery)
    if qStatus '= 1 {
        w "%Prepare failed:" 
        d $System.Status.DisplayError(qStatus) 
        q
    }
    s rset = tStatement.%Execute()
    d rset.%Display()
    w !,"End of data"
}

将日期转换为数字数据类型将返回该日期的$HOROLOG值。
这是一个整数值,表示自1840年12月31日以来的天数。

将日期转换为字符数据类型可以返回完整的日期,也可以返回数据类型长度所允许的全部日期。
但是,对所有字符数据类型来说,显示格式并不相同。
CHAR VARYINGCHARACTER VARYING数据类型以显示格式返回完整的日期。
例如,如果日期显示为MM/DD/YYYY,这些数据类型将日期返回为具有相同格式的字符串。
其他字符数据类型以ODBC日期格式的字符串形式返回日期(或其中的一部分)。
例如,如果日期显示为mm/dd/yyyy,这些数据类型将日期返回为yyyy - mm - dd格式的字符串。
因此,对于日期04/24/2004,CHAR数据类型返回'2'(年份的第一个字符),而CHAR(8)返回' 2004-04 - '

上一篇下一篇

猜你喜欢

热点阅读