第九章 其他参考资料(二)
特殊变量 (SQL)
系统提供的变量。
$HOROLOG
$JOB
$NAMESPACE
$TLEVEL
$USERNAME
$ZHOROLOG
$ZJOB
$ZPI
$ZTIMESTAMP
$ZTIMEZONE
$ZVERSION
SQL直接支持许多对象脚本特殊变量。这些变量包含系统提供的值。只要可以在SQL中指定文字值,就可以使用它们。
SQL特殊变量名不区分大小写。大多数可以使用缩写来指定。
系统提供的变量。
$HOROLOG
$JOB
$NAMESPACE
$TLEVEL
$USERNAME
$ZHOROLOG
$ZJOB
$ZPI
$ZTIMESTAMP
$ZTIMEZONE
$ZVERSION
SQL直接支持许多对象脚本特殊变量。这些变量包含系统提供的值。只要可以在SQL中指定文字值,就可以使用它们。
SQL特殊变量名不区分大小写。大多数可以使用缩写来指定。
IRIS® 数据平台提供了用于登录数据库和开始使用的默认用户名和密码。默认用户名为“_SYSTEM”(大写),密码为“sys”。
执行大多数 SQL操作都会发出SQLCODE值。发出的SQLCODE值为0、100和负整数值。
SQLCODE=0表示SQL操作成功完成。对于SELECT语句,这通常意味着从表中成功检索数据。但是,如果SELECT执行聚合操作(例如:SELECT SUM(Myfield)),则聚合操作成功,即使myfield中没有数据,也会发出SQLCODE=0;在这种情况下,SUM返回NULL,%ROWCOUNT=1。SQLCODE=100表示SQL操作成功,但没有找到可操作的数据。发生这种情况的原因有很多。对于SELECT,这些包括:指定表不包含数据;表不包含满足查询条件的数据;或者行检索已到达表的最后一行。对于UPDATE或DELETE,它们包括:指定的表不包含数据;或者表不包含满足WHERE子句条件的数据行。在这些情况下,%ROWCOUNT=0。SQLCODE=-n表示错误。负整数值指定发生的错误类型。SQLCODE=-400是通用的致命错误代码。字段约束指定管理字段允许的数据值的规则。
管理门户提供管理全局变量的工具,系统类提供执行某些相同任务的方法。本章介绍如何使用这些工具。
与ObjectScript命令SET、MERGE、KILL和其他命令一样,这里描述的工具提供了直接访问操作全局变量的权限。如果通过全局访问删除或修改,则会绕过所有对象和SQL完整性检查,并且没有撤消选项。因此,在执行这些任务时要非常小心,这一点很重要。(查看和导出不会影响数据库,并且是安全活动。)
使用本章中介绍的工具时,请确保以下事项:
即使应用程序从不执行任何直接全局访问,应用程序也会使用全局变量。请记住,如果创建持久类,则它们的数据和任何索引都存储在全局变量中,全局变量的名称基于类名(默认情况下)。
管理门户包括全局页面,该页面允许管理全局。在此页上,可以执行以下操作:
此页还包括用于查看例程和类的选项;此处不讨论这些选项。
验证和转换 ODBC 日期、时间或时间戳。
{d 'yyyy-mm-dd'}
{d nnnnnn}
{t 'hh:mm:ss[.fff]'}
{t nnnnn.nnn}
{ts 'yyyy-mm-dd [hh:mm:ss.fff]'}
{ts 'mm/dd/yyyy [hh:mm:ss.fff]'}
{ts nnnnnn}
这些构造采用 ODBC 日期、时间或时间戳格式的整数或字符串,并将其转换为相应的 IRIS 日期、时间或时间戳格式。他们执行数据输入以及值和范围检查。
{d 'string'}{d 'string'}日期构造验证 ODBC 格式的日期。如果日期有效,它将以 IRIS $HOROLOG 日期格式存储(逻辑模式)作为 1840-12-31 的整数计数值。 IRIS 不附加默认时间值。要支持早于 1840-12-31 的日期,必须在表中定义数据类型为 %Library.Date(MINVAL=-nnn) 的日期字段,其中 MINVAL 是从 1840-12-31 倒数的负天数(第 0 天)最大为 -672045 (0001-01-01)。
-672045 (0001-01-01) 或大于 2980013 (9999-12-31) 的整数会生成 SQLCODE -400 错误。在查询元数据和其他上下文中,为列定义的数据类型可以作为整数代码返回。 CType(客户端数据类型)整数代码列在 %SQL.StatementColumn clientType 属性中。
ODBC 和 JDBC 使用 xDBC 数据类型代码 (SQLType)。 ODBC 数据类型代码由 %SQL.Statement.%Metadata.columns.GetAt() 方法返回,如上例所示。 SQL Shell 元数据还返回 ODBC 数据类型代码。 JDBC 代码与 ODBC 代码相同,除了时间和日期数据类型的表示。
%Library.String 数据类型支持的最大字符串长度为 3,641,144 个字符。通常,极长的字符串应分配为 %Stream.GlobalCharacter 数据类型之一。
因为 IRIS 支持 xDBC 协议 50 和更高版本,所以没有强制执行 ODBC 或 JDBC 字符串长度限制。如果 IRIS 实例和 ODBC 驱动程序支持不同的协议,则使用两个协议中较低的一个。实际使用的协议记录在 ODBC 日志中。
请注意,默认情况下 IRIS 建立系统范围的 ODBC VARCHAR 最大长度为 4096;此 ODBC 最大长度是可配置的。
IRIS 支持列表结构数据类型 %List(数据类型类 %Library.List)。这是一种压缩的二进制格式,不会映射到 SQL 的相应本机数据类型。在其内部表示中,它对应于数据类型 VARBINARY,默认 MAXLEN 为 32749。 IRIS 支持列表结构数据类型 %ListOfBinary(数据类型类 %Library.ListOfBinary)对应于数据类型 VARBINARY,默认 MAXLEN 为 4096。
因此,动态 SQL 不能在 WHERE 子句比较中使用 %List 数据。也不能使用 INSERT 或 UPDATE 来设置 %List 类型的属性值。
可以定义日期、时间和时间戳数据类型,并通过标准 SQL 日期和时间函数相互转换日期和时间戳。例如,可以使用 CURRENT_DATE 或 CURRENT_TIMESTAMP 作为使用该数据类型定义的字段的输入,或者使用 DATEADD、DATEDIFF、DATENAME 或 DATEPART 来操作使用该数据类型存储的日期值。
数据类型类 %Library.Date、%Library.Time、%Library.PosixTime、%Library.TimeStamp 和 %MV.Date 对于 SqlCategory 的处理方式如下:
%Library.Date 类以及逻辑值为 +$HOROLOG($HOROLOG 的日期部分)的任何用户定义数据类型类都应使用 DATE 作为 SqlCategory。默认情况下,DATE 和对应的 %Library.Date 数据类型只接受正整数,0 代表 1840-12-31。要支持早于 1840-12-31 的日期,必须在表中定义数据类型为 %Library.Date(MINVAL=-nnn) 的日期字段,其中 MINVAL 是从 1840-12-31 倒数的负天数最大为 -672045 (0001-01-01)。 %Library.上表中为 DDL 和 IRIS 数据类型表达式显示的语法是为 SQL.SystemDataTypes 配置的默认映射。对于提供的系统数据类型和用户数据类型,有单独的映射表可用。
要查看和修改当前数据类型映射,请转到管理门户,选择系统管理、配置、SQL 和对象设置、系统 DDL 映射。
将数据类型从 DDL 映射到 IRIS 时,常规参数和函数参数遵循以下规则:
%# 格式标识。例如: VARCHAR(%1)
映射到:
%String(MAXLEN=%1)
因此,DDL 数据类型为:
VARCHAR(10)
映射到:
%String(MAXLEN=10)
MAXVAL、MINVAL 和 SCALE 参数。指定 SQL 实体(如列)可以包含的数据类型。
此处描述了以下主题:
支持的 DDL 数据类型及其类属性映射表
数据类型优先级用于从具有不同数据类型的数据值中选择最具包容性的数据类型
日期、时间、PosixTime 和时间戳数据类型
支持字符串数据类型、列表数据类型和流数据类型
支持 ROWVERSION 数据类型
IRIS® 数据平台 ODBC / JDBC 公开的数据类型
使用查询元数据方法和数据类型整数代码确定列的数据类型
创建用户定义的数据类型
处理未定义的数据类型
数据类型转换函数
数据类型指定列可以保存的值的种类。在使用 CREATE TABLE 或 ALTER TABLE 定义字段时指定数据类型。定义 SQL 字段时,可以指定下表(左列)中列出的 DDL 数据类型。当指定其中一种 DDL 数据类型时,它会映射到右侧列中列出的IRIS 数据类型类。在IRIS 中定义字段时,可以指定 DDL 数据类型或数据类型类。 DDL 数据类型名称不区分大小写。数据类型类名称区分大小写。 %Library 数据类型类可以通过全名(例如,%Library.String)或短名(%String)来指定。
绕过ODBC使用ObjectScript访问远程系统
这是一个在 IRIS 2020.1 和 Caché 2018.1.3 上工作的代码示例
不会与新版本保持同步
也不会获得 InterSystems 提供的支持服务!
我们经常会遇到这样的情况,由于各种原因ODBC是访问一个远程系统的唯一选择。如果你只需要检查或改变表,这就足够了。但你不能直接执行一些命令或改变一些Global。
特别感谢@Anna Golitsyna 启发我发表此文。
这个例子提供了3种 SQLprocedure 方法来实现访问远程系统这个目的,如果其他的访问方式被阻止,通常是被一些防火墙阻止。
返回日期表达式的年份的日期函数。
YEAR(date-expression)
{fn YEAR(date-expression)}
date-expression - 计算结果为 日期整数、ODBC 日期字符串或时间戳的表达式。此表达式可以是列名、另一个标量函数的结果或日期或时间戳字面量。YEAR 将日期整数($HOROLOG 日期)、ODBC 格式日期字符串或时间戳作为输入。 YEAR 以整数形式返回相应的年份。
日期表达式时间戳可以是数据类型 %Library.PosixTime(编码的 64 位有符号整数),也可以是数据类型 %Library.TimeStamp (yyyy-mm-dd hh:mm:ss.fff)。
年份 (yyyy) 部分应该是 0001 到 9999 范围内的四位整数。输入时前导零是可选的。前导零在输出上被抑制。两位数的年份不会扩展到四位数。
date-expression 的日期部分经过验证,并且必须包含 1 到 12 范围内的月份以及指定月份和年份的有效日期值。否则,将生成 SQLCODE -400 错误 。
如果日期表达式的时间部分存在,则对其进行验证,但可以省略。
注意:为了与 内部日期表示兼容,强烈建议将所有年份值表示为 0001 到 9999 范围内的四位整数。
格式化多个 XML 标记以包含表达式值的函数。
XMLFOREST(expression [AS tag][,expression [AS tag]])
expression - 任何有效的表达式。通常是包含要标记的数据值的列的名称。当指定为逗号分隔列表时,列表中的每个表达式都将包含在其自己的 XML 标记标记中。AS tag - 可选 — XML 标记标记的名称。如果指定了标签,则 AS 关键字是必需的。保留标签中字母的大小写。
用双引号括起来的标签是可选的。如果省略双引号,标签必须遵循 XML 命名标准。用双引号括起来的标签消除了这些命名限制。XMLFOREST 对有效的标签名称实施 XML 命名标准。它不能包含任何字符!"#$%&'()*+,/;<=>?@[\]^``{|}~,也不能包含空格字符,并且不能以 "-", ".", 或数字。
如果指定不带 AS 标记子句的表达式,则标记值是表达式列的名称(大写字母):。
XMLFOREST 函数返回用其自己的 XML 标记开始标记和结束标记标记的每个表达式的值,如 tag 中指定的那样。例如,XMLFOREST(Home_City AS City,Home_State AS State) 返回如下值:
一种格式化 XML 标记标记以包含一个或多个表达式值的函数。
XMLELEMENT([NAME] tag,expression[,expression])
XMLELEMENT([NAME] tag,XMLATTRIBUTES(expression [AS alias]),expression[,expression])
NAME tag - XML标记的名称。NAME关键字是可选的。该参数有三种语法形式: NAME "tag", "tag"和NAME。前两者在功能上是相同的。如果指定,标记必须用双引号括起来。标签中的字母大小写保持不变。XMLELEMENT不执行标记值的验证。然而,XML标准要求有效的标记名不能包含任何字符 !"#$%&'()*+,/;<=>?@[\]^``{|}~,并且不能以"-", "."或数字开头。
如果指定没有标记值的 NAME 关键字, 将提供默认标记值:。 NAME 关键字不区分大小写;结果标签初始大写。
expression - 任何有效的表达式。通常是包含要标记的数据值的列的名称。可以指定以逗号分隔的列列表或其他表达式,所有这些都将包含在同一标记中。第一个以逗号分隔的元素可以是 XMLATTRIBUTES 函数。只能指定一个 XMLATTRIBUTES注:IRIS函数。
连接 XML 元素的函数。
XMLCONCAT(XmlElement1,XmlElement2[,...])
XmlElement - XMLELEMENT 函数。指定两个或多个要连接的 XmlElement。XMLCONCAT 函数将来自多个 XMLELEMENT 函数的值作为单个字符串返回。 XMLCONCAT 可用于引用表或视图的 SELECT 查询或子查询。 XMLCONCAT 可以与普通字段值一起出现在 SELECT 列表中。
以下查询连接来自两个 XMLELEMENT 函数的值:
SELECT Name,XMLCONCAT(XMLELEMENT("Para",Name),
XMLELEMENT("Para",Home_City)) AS ExportString
FROM Sample.Person
一个日期函数,它将一年中的第几周作为日期表达式的整数返回。
{fn WEEK(date-expression)}
date-expression - 一个表达式,它是列的名称、另一个标量函数的结果,或者是日期或时间戳文字。WEEK 接受一个日期表达式,并返回该日期从年初开始的周数。
默认情况下,使用 $HOROLOG 日期(从 1840 年 12 月 31 日开始的正整数或负整数天数)计算周数。因此,周数是逐年计算的,因此第 1 周是完成从上一年最后一周开始的 7 天期间的天数。一周总是从星期日开始;因此,日历年的第一个星期日标志着从第 1 周到第 2 周的变化。如果一年中的第一个星期日是 1 月 1 日,则该星期日是第 1 周;如果一年中的第一个星期日晚于 1 月 1 日,则该星期日是第 2 周的第一天。因此,第 1 周的长度通常少于 7 天。可以使用 DAYOFWEEK 函数确定星期几。一年中的总周数通常为 53,闰年可能为 54。
IRIS 还支持确定一年中星期的 ISO 8601 标准。该标准主要用于欧洲国家。当配置为 ISO 8601 时,WEEK 从星期一开始计算星期,并将星期分配给包含该星期星期四的年份。
返回当前用户的用户名的函数。
USER
{fn USER}
{fn USER()}
USER 不接受任何参数并返回当前用户的用户名(也称为授权 ID)。通用函数不允许括号; ODBC 标量函数可以指定或省略空括号。
用户名是使用 CREATE USER 命令定义的。
USER 的典型用途是在 SELECT 语句选择列表或查询的 WHERE 子句中。在设计报告时,USER 可用于打印正在为其生成报告的当前用户。
以下示例返回当前用户名:
SELECT USER AS CurrentUser
yx
以下示例选择姓氏 ($PIECE(Name,',',1) 或名字(没有中间首字母)与当前用户名匹配的那些记录:
SELECT Name FROM Sample.Person
WHERE %SQLUPPER(USER)=%SQLUPPER($PIECE(Name,',',1))
OR %SQLUPPER(USER)=%SQLUPPER($PIECE($PIECE(Name,',',2),' ',1))
将字符串表达式中的所有小写字母转换为大写字母的大小写转换函数。
UPPER(expression)
UPPER expression
expression - 字符串表达式,可以是列名、字符串文字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHAR 或 VARCHAR)。UPPER 函数将所有字母字符转换为大写字母。这是 LOWER 函数的反函数。 UPPER 保留不变的数字、标点符号和前导或尾随空格。
UPPER 不强制将数字解释为字符串。 SQL 从数字中删除前导零和尾随零。指定为字符串的数字保留前导零和尾随零。
也可以使用 UPPER() 方法调用从 ObjectScript 调用此函数:
$SYSTEM.SQL.Functions.UPPER(expression)
UPPER 是字母大小写转换的标准函数,而不是排序规则。对于大写排序规则,使用 %SQLUPPER,它提供了数字、NULL 值和空字符串的高级排序规则。
以下示例返回所有名称,选择那些名称的大写形式以“JO”开头的名称:
SELECT Name
FROM Sample.注:此函数IRIS可用,Cache不可用。
将日期表达式转换为 UNIX 时间戳的日期/时间函数。
UNIX_TIMESTAMP([date-expression])
date-expression - 可选 — 作为列名称、另一个标量函数的结果或日期或时间戳文字的表达式。 UNIX_TIMESTAMP 不会从一个时区转换到另一个时区。如果省略 date-expression,则默认为当前 UTC 时间戳。UNIX_TIMESTAMP 返回一个 UNIX® 时间戳,即自 '1970-01-01 00:00:00'以来的秒数(和小数秒)。
如果不指定 date-expression,则 date-expression 默认为当前 UTC 时间戳。因此,假设系统范围的默认精度为 3,UNIX_TIMESTAMP() 等效于 UNIX_TIMESTAMP(GETUTCDATE(3))。
如果指定 date-expression,UNIX_TIMESTAMP 会将指定的 date-expression 值转换为 UNIX 时间戳,计算该时间戳的秒数。 UNIX_TIMESTAMP 可以返回正数或负数秒数。
UNIX_TIMESTAMP 将其值作为数据类型 %Library.Numeric 返回。它可以返回小数秒的精度。
将字符串中的所有小写字母转换为大写字母的大小写转换函数。
UCASE(string-expression)
{fn UCASE(string-expression)}
string-expression - 要将其字符转换为大写的字符串。表达式可以是列名、字符串文字或另一个标量函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHAR 或 VARCHAR)。UCASE 将小写字母转换为大写以进行显示。它对非字母字符没有影响;它保留不变的数字、标点符号和前导或尾随空格。
请注意,UCASE 可用作 ODBC 标量函数(使用花括号语法)或 SQL 通用函数。
UCASE 不强制将数字解释为字符串。 SQL 从数字中删除前导零和尾随零。指定为字符串的数字保留前导零和尾随零。
UCASE 不影响排序规则。 %SQLUPPER 函数是 SQL 中为不区分大小写的排序规则转换数据值的首选方法。
也可以使用 UPPER() 方法调用从 ObjectScript 调用此函数:
$SYSTEM.SQL.UPPER(expression)
以下示例以大写字母返回每个人的姓名:
SELECT Name,{fn UCASE(Name)} AS CapName
FROM Sample.$TSQL_NEWID()
$TSQL_NEWID 返回一个全局唯一 ID (GUID)。 GUID 用于在偶尔连接的系统上同步数据库。 GUID 是一个 36 个字符的字符串,由 32 个十六进制数字组成,由连字符分成五组。它的数据类型是 %Library.UniqueIdentifier。
在 SQL 中提供了 $TSQL_NEWID 以支持Transact-SQL (TSQL)。对应的 TSQL 函数是 NEWID。
$TSQL_NEWID 函数不接受任何参数。请注意,参数括号是必需的。
%Library.GUID 抽象类提供对全局唯一 ID 的支持,包括 AssignGUID() 方法,该方法可用于为类分配全局唯一 ID。要生成 GUID 值,请使用 %SYSTEM.Util.CreateGUID() 方法。
以下示例返回一个 GUID:
SELECT $TSQL_NEWID()
E8B3E0AB-5F5B-4E7F-B59F-166F5A56E055
在使用xDBC连接到字符集为US7ASCII的Oracle数据库时,大家可能遇到过中文的乱码问题,尤其是使用Oracle自己的xDBC驱动的时候。
字符集为US7ASCII的Oracle数据库虽然可以保存中文数据,但给客户端带来了很多麻烦,需要对获取和提交的数据进行转码。
在Ensemble/Health Connect/InterSystems IRIS 中使用SQL适配器连接到这样的Oracle数据库时,可以使用$ZCVT函数进行转码。
1. $ZCVT函数
$ZCVT函数是广泛使用的字符串转换函数,可以做大小写转换、编码转换、URL 和 URI 转换等。我们用其编码转换能力来解决字符集转码问题。
2. 获取的SQL结果集数据有中文时
这时,Oracle的驱动返回的中文数据通常是GB码,而不是Unicode或UTF码。可以通过$ZCVT函数对GB码的数据进行转码,转换为Unicode:
Set tCorrectData = $ZCVT(tOriginalData,"I","GB18030")其中$ZCVT函数的第一个参数tOriginalData是获取到到结果集字段值;第二个参数“I”说明tOriginalData是输入字符串;第三个参数“GB18030”是说明输入字符串的字符集编码是GB18030。
[toc]
将字符串截断为指定长度并应用 EXACT 排序规则的排序规则函数。
%TRUNCATE(expression[,length])
expression - 字符串表达式,可以是列名、字符串文字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHAR 或 VARCHAR2)。表达式可以是子查询。length - 可选 — 截断长度,指定为整数。返回表达式的初始长度字符。如果省略长度,则 %TRUNCATE 排序规则与 %EXACT 排序规则相同。可以用双括号将长度括起来以抑制文字替换:((length))。%TRUNCATE 将表达式截断为指定的长度,然后在 EXACT 排序规则序列中返回它。
EXACT 排序规则首先按数字顺序排列纯数值(x=+x 的值),然后是字符串排序规则序列中的所有其他字符。 EXACT 字符串整理顺序与 ANSI 标准 ASCII 整理顺序相同:在大写字母字符之前整理数字,在小写字母字符之前整理大写字母字符。标点符号出现在序列中的多个位置。
%TRUNCATE 通过 NULL 不变。
%TRUNCATE 是一个 SQL 扩展,用于 SQL 查找查询。
也可以使用 TRUNCATE() 方法调用从 ObjectScript 调用此函数:
DHC-APP> WRITE $SYSTEM.标量数值函数,按指定位数截断一个数。
{fn TRUNCATE(numeric-expr,scale)}
numeric-expr - 要截断的数字。数字或数字表达式。scale - 计算结果为一个整数的表达式,该整数指定要截断的位数,从小数点开始计算。可以是零、正整数或负整数。如果比例是小数,会将其舍入为最接近的整数。Truncate返回NUMERIC或DOUBLE数据类型。如果NUMERIC-EXPR的数据类型为DOUBLE,则TRUNCATE返回DOUBLE;否则返回NUMERIC。
TRUNCATE通过从小数点开始按小数位数截断NUMERIC-EXPR。它不对数字进行四舍五入,也不添加填充零。在截断操作之前,将删除前导零和尾随零。
Scale为零,则该数字将被截断为整数。换句话说,在小数点右侧的零位数处执行截断;所有小数位和小数点本身都被截断。NUMERIC-EXPR为零(但表示为00.00、-0等)。TRUNCATE返回0(零),不带小数位数,无论小数位数是多少。字符串函数,它返回删除了指定的前导和/或尾随字符的字符串。
TRIM([end_keyword] [characters FROM] string-expression)
end_keyword - 可选 — 一个关键字,指定要剥离的字符串表达式的哪一端。可用值为 LEADING、TRAILING 或 BOTH。默认为两者。characters - 可选 — 一个字符串表达式,指定要从字符串表达式中删除的字符。指定字符的每个实例都从指定的末端被剥离,直到遇到此处未指定的字符。因此TRIM(BOTH 'ab' FROM 'bbbaacaaa') 返回 ‘c’。在此示例中,BOTH 关键字是可选的。如果未指定字符,TRIM 会去除空格。如果指定了字符,则需要 FROM 关键字。如果指定了 end_keyword 而未指定字符,则允许使用 FROM 关键字(但不是必需的)。如果没有指定这些参数,则不允许使用 FROM 关键字。string-expression - 要剥离的字符串表达式。字符串表达式可以是列名、字符串文字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHAR 或 VARCHAR2)。如果省略了字符和 end_keyword,则省略 FROM 关键字。TRIM 从提供的值的开头和/或结尾去除指定的字符。
将格式化字符串转换为时间戳的日期函数。
TO_TIMESTAMP(date_string[,format])
date_string - 要转换为时间戳的字符串表达式。此表达式可能包含日期值、时间值或日期和时间值。format - 可选 — 对应于 date_string 的日期和时间格式字符串。如果省略,则默认为 DD MON YYYY HH:MI:SS。TO_TIMESTAMP 函数将各种格式的日期和时间字符串转换为标准时间戳,数据类型为 TIMESTAMP。 TO_TIMESTAMP 返回具有以下格式的时间戳:
yyyy-mm-dd hh:mm:ss
始终包括前导零。时间使用 24 小时制指定。默认情况下,返回的时间戳不包括小数秒。
注意:TO_TIMESTAMP 以 ODBC 格式返回标准时间戳。 TO_POSIXTIME 返回一个编码的 64 位时间戳。 TO_POSIXTIME 是新编程的推荐时间戳格式。
必须指定匹配的 date_string 和格式。如果省略格式,则 date_string 必须匹配 DD MON YYYY HH:MI:SS。
如果 date_string 省略了时间戳的组成部分,则 TO_TIMESTAMP 提供缺少的组成部分。
注:此函数在IRIS版本可用,Cache不可用。
将格式化的日期字符串转换为 %PosixTime 时间戳的日期/时间函数。
TO_POSIXTIME(date_string[,format])
date_string - 要转换为 %PosixTime 时间戳的字符串表达式。此表达式可能包含日期值、时间值或日期和时间值。format - 可选 — 对应于 date_string 的日期和时间格式字符串。如果省略,则默认为 DD MON YYYY HH:MI:SS。TO_POSIXTIME 函数将各种格式的日期和时间字符串转换为 %PosixTime 时间戳,数据类型为 %Library.PosixTime。 TO_POSIXTIME 返回 %PosixTime 时间戳作为计算值,该值基于从 1970-01-01 00:00:00 的任意起点经过的秒数,编码为 64 位有符号整数。从该日期开始经过的实际秒数(和小数秒)是 Unix®timestamp,一个数值。 对 Unix® 时间戳进行编码以生成 %PosixTime 时间戳。由于 %PosixTime 时间戳值已编码,因此 1970-01-01 00:00:00 表示为 1152921504606846976。
将字符串表达式转换为 NUMERIC 数据类型的值的字符串函数。
TO_NUMBER(string-expression)
TONUMBER(string-expression)
string-expression - 要转换的字符串表达式。表达式可以是列名、字符串文字或另一个函数的结果,其中基础数据类型为 CHAR 或 VARCHAR2 类型。名称 TO_NUMBER 和 TONUMBER 可以互换。它们支持 Oracle 兼容性。
TO_NUMBER 将字符串表达式转换为数字数据类型 NUMERIC。但是,如果 string-expression 的数据类型为 DOUBLE,则 TO_NUMBER 返回一个数据类型为 DOUBLE 的数字。
TO_NUMBER 转换采用数字字符串并通过解析加号和减号、扩展指数符号(“E”或“e”)以及删除前导零将其转换为规范数字。 TO_NUMBER 在遇到非数字字符(例如字母或数字组分隔符)时停止转换。因此字符串 '7dwarves' 转换为 7。如果 string-expression 的第一个字符是非数字字符串,则 TO_NUMBER 返回 0。如果 string-expression 是空字符串 (''),则 TO_NUMBER 返回 0。TO_NUMBER 将 -0 解析为 0 .
我们很高兴地宣布,从7.2.4版本开始,DBeaver已经支持开箱即用InterSystems IRIS的。 你不需要再手动配置它,只要在连接列表中找到IRIS的图标即可。
.png)
可以使用 DDD 将一年中的某一天(自 1 月 1 日以来经过的天数)转换为实际日期。格式字符串 DDD YYYY 必须与由整数天数和四位数年份组成的相应 date_string 配对。 (与 DDD 一起使用时,两位数的年份必须指定为 RR(而不是 YY)。)格式字符串 DDD 默认为当前年份。经过的天数必须是 1 到 365 范围内的正整数(如果 YYYY 是闰年,则为 366)。四位数年份必须在标准 日期范围内:1841 到 9999。DDD 和 YYYY 格式元素可以按任意顺序指定;它们之间的分隔符是强制性的。以下示例显示了这一年中的一天的用法:
/// d ##class(PHA.TEST.SQLFunction).ToDate4()
ClassMethod ToDate4()
{
NEW SQLCODE
&sql(
SELECT TO_DATE('2018:60','YYYY:DDD')
INTO :a
)
if SQLCODE = 0 {
w a," = ",$ZDATE(a,1,,4)
} else {
w "error:",SQLCODE
}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).将格式化字符串转换为日期的日期函数。
TO_DATE(date_string[,format])
TODATE(date_string[,format])
date_string - 要转换为日期的字符串。基础数据类型为 CHAR 或 VARCHAR2 的字符串日期表达式。format - 可选 — 对应于 date_string 的日期格式字符串。如果省略格式,DD MON YYYY& 是默认值;此默认值是可配置的。名称 TO_DATE 和 TODATE 是可互换的,并且支持 Oracle 兼容性。
TO_DATE 函数将各种格式的日期字符串转换为日期整数值,数据类型为 DATE。它用于输入各种字符串格式的日期,并将它们存储在标准的内部表示中。 TO_DATE 返回具有以下格式的日期:
nnnnn
其中 nnnnn 是介于 0(1840 年 12 月 31 日)和 2980013(9999 年 12 月 31 日)之间的正整数,包括端点。这表示天数。时间值被忽略。 1840 年 12 月 31 日之前的日期可以使用儒略日期来表示,如下所述。
也可以使用 TODATE() 方法调用从 ObjectScript 调用此函数:
$SYSTEM.SQL.Functions.