融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-1
第十二章
ESQL/C中使用DATATIME和
INTERVAL数据类型
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-2
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
使用DATETIME和INTERVAL
数据类型
目标
学完本章后你将能够:
·决定处理DATETIME和INTERVAL的C主变量类型.
·定义并初始化DATETIME和INTERVAL变量.
·使用ESQL/C库函数转换DATETIME和INTERVAL为字
符串或者相反.
本章的目标列在上面。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-3
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
DATETIME和INTERVAL类型
typedefstructdtime{
shortdt_qual;
dec_tdt_dec;
}dtime_t;
typedefstructintrvl{
shortin_qual;
dec_tin_dec;
}intrvl_t;
·DATETIME存放时间?
·INTERVAL存放时间间隔.
·结构定义在头文件$INFORMIXDIR/incl/esql/datetime.h
Qualifiers
Qualifiers
DATETIME数据类型存放时间戳。时间戳由这些部分组成:
YEAR、MONTH、DAY、HOUR、MINUTE、SECOND和秒的
FRACTION(n)。例如,可以使用记法:11-3112:30来定义时间范围,
从月到分(包括月份、日、小时和分)。
INTERVAL时间类型存放时间段。时间段可以用YEAR、MONTH、
DAY到秒的FRACTION来表示。象DATETIME一样,INTERVAL
有几个部分组成。例如,INTERVAL值2812:30表示28天12小时
30分。
正如你所见,两种时间类型都有特定的精度,该精度称为修饰符。
修饰符是这些数据类型的组成部分。
两种数据类型存放的结构在头文件datetime.h中都有定义。它们
以DECIMAL类型存储,小数点右边的有效位数是0,精度等于修饰
符隐含指明的数字的位数。
这就是为什么datetime.h要包含decimal.h。这样,使用DECIMAL
和DATETIME或INTERVAL类型时,不需要包含进文件decimal.h。
因为这些数据类型不对应于任何标准的C的数据类型,所以需要
使用特别的ESQL/C例程来处理类型转换,这在本章的后面部分将要
讨论。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-4
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
为DATETIME声明主变量
$includedatetime;
语法DATETIMELargestQualifierTOSmallestQualifier
示例:$datetimeyeartominuteWinTimeL_dt;
YEARMONTHDAY
HOURMINUTESECOND
FRACTION(n)
此处最大和最小限定词是下面之一:
语法DATETIME
在本例中,没有定义限定词,某些情况下需要使用定义在datetime.h文件
中的宏来初始化限定词,.
示例:$datetimeWinTimeL_dt;
OR
OR
当使用DATETIME宿主变量时,必须包含头文件datetime.h。
DATETIME修饰符有两个部分:一部分表示最大粒度
(LargestQualifier),一部分表示最小粒度(SmallestQualifier)。
定义DATETIME变量时,不一定要说明修饰符,修饰符是可选的。
如果省略修饰符,有时必须使用宏来初始化它们,宏在本章的后面部
分讨论。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-5
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
为INTERVAL声明主变量
示例:$intervaldaytominuteLagTimeL_it;
$intervalLeadTimeL_it;
$includedatetime;
语法:INTERVALLargestQualifierTOSmallestQualifier
此处最大和最小限定词是下面几类之一
Year-Month间隔类Day-TimeInterval间隔类
YEARDAY
MONTHHOUR
MINUTE
SECOND
FRACTION
使用INTERVAL宿主变量也要求包含进头文件datetime.h。
如同DATETIME,INTERVAL的修饰符也有两个部分。
INTERVAL修饰符的形式如上面所示。为INTERVAL类型说明修
饰符时,必须确保两个部分是同一类(class)。
定义INTERVAL变量时,不一定要说明修饰符,修饰符是可选的。
如果省略修饰符,有时必须使用宏来初始化它们,宏在本章的后面部
分讨论。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-6
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
取回数据时限定词的作用
$intervaldaytominuteLagTimeL_it;
$intervalLeadTimeL_it;
数据库服务器首先检查LagTimeL_it
的限定词的有效性和兼容性.
数据库服务器首先检查LagTimeL_it
的限定词的有效性和兼容性.
intervaldaytocond
数据库服务器初始化
LeadTimeL_it的限定词为正在
取回的字段的限定词.
数据库服务器初始化
LeadTimeL_it的限定词为正在
取回的字段的限定词.
当把DATETIME和INTERVAL数据库值存放到DATETIME和
INTERVAL宿主变量时,在宿主变量的定义时可以省略修饰符。同时,
也不必初始化修饰符。
在这种情形下,数据库服务器把dt_qual或in_qual域初始化为与
数据库中的定义同样的值。返回值是数据库中的值。
当说明了修饰符时,数据库服务器要检查它。如果是合法的,数
据库服务器:
DATETIME返回数据库值,需要时扩展它
INTERVAL返回数据库值
如果修饰符是不合法的,数据库服务器将初始化它,如同开始时
就省略了修饰符一样。然后,数据库返回值,正如上面所列。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-7
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
取回数据时的隐式转换
$charLagTimeLc12[12];
$charLagTimeLc12[7];
数据库服务器将interval转换成
字符串存放在LagTimeLc12中.
数据库服务器将interval转换成
字符串存放在LagTimeLc12中.
intervaldaytocond
数据库服务器存放任意串值到
LagTimeLc7中.
数据库服务器存放任意串值到
LagTimeLc7中.
sqlwarn1='W'
indicator=1
sqlwarn1=''
indicator=0
可以让数据库服务器自动把DATETIME和INTERVAL类型的数
据库值转换成字符串。在把这些值放到宿主变量:char、string或
fixchar之前,会进行隐式的数据转换。
把这类的值存放到数组中时,如果数组太短,则会溢出。在这种
情况里,数据库服务器:
使用星号(*)来填充数组
把sqlwarn1设置为W
把指示变量的值设置为1
不能把DATETIME和INTERVAL类型的数据库值字符存放到数
值类型的数值变量。如果这样做,会导致错误的产生。为把这类的数
据库值转换成等价的数值类型,要使用ESQL/C库中的适当的转换例
程,将在本章的后面部分讨论它们。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-8
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
存储数据时限定词的作用
intervaldaytocond
$intervaldaytominuteLagTimeL_it;
$intervalLeadTimeL_it;
数据库服务器首先检查
LagTimeL_it限定词的有效性
和兼容性.
数据库服务器首先检查
LagTimeL_it限定词的有效性
和兼容性.
在插入值之前必须用TU_IENCODE
宏初始化限定词.
在插入值之前必须用TU_IENCODE
宏初始化限定词.
示例1
示例1
示例2
示例2
当把DATETIME和INTERVAL类型的值存放到数据库中各自的
字段中时,在把值传递给数据库服务器之前,必须初始化它们的修饰
符。有两种方法可以完成:
在宿主变量的定义时指明修饰符(例子1)。
使用datetime.h中提供的合适的宏(例子2)。
如果没有使用两种方法之一来初始化修饰符,而试图存储
DATETIME和INTERVAL值,数据库服务器返回SQLERROR。
当定义了修饰符时,数据库服务器将检查它的合法性。如果合法,
数据库服务器:
DATETIME存储数据库值,需要时扩展它。
INTERVAL存储数据库值。
如果修饰符不合法或为0,数据库服务器返回SQLERROR。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-9
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
存储数据时的隐式转换
$charLagTimeLc12[12];
$charLagTimeLc9[9];
数据库服务器将存放在
LagTimeLc12中字符串
转换成interval并存放
到数据库中
.
数据库服务器将存放在
LagTimeLc12中字符串
转换成interval并存放
到数据库中
.
intervaldaytocond
因为LagTimeLc9中的串不
是精确匹配数据库服务器
返回一个错误.
因为LagTimeLc9中的串不
是精确匹配数据库服务器
返回一个错误.sqlerror<0
sqlerror=0
该字符串缺少"天".
该字符串缺少"天".
可以让数据库服务器自动把字符串转换成DATETIME和
INTERVAL类型的数据库值。通过把这些值放到宿主变量char、string
或fixchar中,当把这些值传递给数据库服务器时,会进行隐式的数
据转换。
当把一个字符串传递给数据库服务器用来存放到DATETIME或
INTERVAL数据库字段中时,字符串中的字符必须,一个域对一个域,
同字段的修饰符说明完全相匹配。否则,服务器返回SQLERROR。
不能给数据库的DATETIME和INTERVAL字段传递数值类型的
值。这样做会导致SQLERROR。为把这类数值类型的值转换成等价
的DATETIME或INTERVAL类型的值,要使用ESQL/C库中适当的
转换例程,将在本章的后面部分讨论它们。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-10
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
DATETIME&INTERVAL
限定词宏
当需要直接处理限定词时这些宏和定义名非常
有用
TU_YEAR
TU_MONTH
TU_DAY
TU_HOUR
TU_MINUTE
TU_SECOND
TU_FRAC
TU_Fn
TU_LEN
TU_START
TU_END
TU_DTENCODE
TU_IENCODE
名字宏
在头文件datetime.h中有定义了八个名字和五个宏,可以在操作
DATETIME和INTERVAL值时使用它们:
TU_YEAR
用于year修饰符域的名字
TU_MONTH
用于month修饰符域的名字
TU_HOUR
用于hour修饰符域的名字
TU_DAY
用于day修饰符域的名字
TU_MINUTE
用于minute修饰符域的名字
TU_SECOND
用于cond修饰符域的名字
TU_FRAC
用于开始的fraction修饰符域的名字
TU_Fn
用于结束的fraction(n)修饰符域的名字
(n=1-5)
TU_LEN(q)
返回修饰符q中的数字的位数。
TU_START(q)
从修饰符q返回开始单元。
TU_END(q)
从修饰符q返回结束单元。
TU_DTENCODE(s,e)
从开始单元s和结束单元e组合成
DATETIME修饰符。
TU_IENCODE(p,s,e)
从带有精度p的开始单元s和结束单元e
组合成INTERVAL修饰符。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-11
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
使用定义名和宏示例
下面是一个使用宏定义初始化一个DATETIME主变
量的例子
$includedatetime;
main()
{
$datetimeCallDtimeL_dt;
CallDtimeL__qual=TU_DTENCODE(TU_YEAR,TU_MINUTE);
...
}
该宏设置限定词ofCallDtimeL_dt等
价于"YEARTOMINUTE".
该宏设置限定词ofCallDtimeL_dt等
价于"YEARTOMINUTE".
定义DATETIME主变量时忽
略限定词.
上面的例子示例使用宏TU_DTENCODE来初始化DATETIME修
饰符。
在该例子中,当定义CallDtimeL_dt时省略了修饰符。如果是从数
据库中检索一个DATETIME字段的值到该变量中,则不会造成什么
问题:数据库服务器将会根据要检索的字段来初始化修饰符。
但是,如果是使用某个库例程把DATETIME值存放到该变量,将
会产生错误。这类的例程在本章后面部分讨论。
另外,如果现在要使用该变量向数据库中插入一条记录,
DATETIME字段将插入一个SQL空值。
设置好修饰符,如上面的例子所示,可以完美地使用DATETIME
类型的变量,而不会造成任何不可预料的错误。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-12
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
DATETIME转换函数
这些函数在DATETIME和字符串类型之间转换
dtcvasc
dtcvfmtasc
dtcvasc
dtcvfmtasc
dttoasc
dttofmtasc
dttoasc
dttofmtasc
DATETIME字符串字符串DATETIME
ESQL/C库中有四个函数可以用来在DATETIME和字符串之间转
换:
dtcvasc(from,to)
把ANSI兼容的字符串转换为
DATETIME值。
char*from;
指向数字和分隔符构成的源字符串
的指针。
dtime_t*to;
指向已初始化的目的DATETIME
变量。
dtcvfmtasc(from,fmt,to)
把公式化的字符串转换为
DATETIME值。
char*from;
指向数字和分隔符构成的源字符串
的指针。
char*fmt;
指向格式字符串的指针:参见
DBTIME环境变量。
dtime_t*to;
指向已初始化的目的DATETIME
变量的指针。
dttoasc(from,to)
把DATETIME值转换成ANSI兼容
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-13
的字符串。
char*from;
指向已初始化的源DATETIME值
的指针。
dtime_t*to;
指向目的字符串的指针。
dttofmtasc(from,to,len,fmt)
把DATETIME值转换成格式化的
字符串。
char*from;
指向已初始化的源DATETIME值。
dtime_t*to;
指向目的字符串的指针。
intlen;
目的字符串的长度。
char*fmt;
指向格式字符串的指针:参见
DBTIME环境变量。
这四个函数返回:
0当操作成功时
<0当操作失败时
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-14
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
其它DATETIME函数
这些函数得到当前时间并以不同的限定词拷贝到一个
DATETIME中
dtcurrent-得到当前时间和日期
dtextend-以不同限定词拷贝到限定词datetime中
ESQL/C库中有两个函数可以用来操作DATETIME值:
dtcurrent(to)
把当前的日期和时间赋给一个
DATETIME变量。
dtime_t*to;
指向已初始化的目的DATETIME变量。
dtextend(from,to)
拷贝DATETIME值,使用的是不同的修
饰符。
dtime_t*from;
指向源DATETIME值的指针。
dtime_t*to;
指向已初始化的目的DATETIME变量。
-1268当修饰符不合法时
这两个函数返回:
0当操作成功时
<0当操作失败时
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-15
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
INTERVAL转换函数
这些函数将INTERVAL转换为字符串类型或者相反
incvasc
incvfmtasc
incvasc
incvfmtasc
intoasc
intofmtasc
intoasc
intofmtasc
INTERVAL字符串字符串INTERVAL
ESQL/C库中有四个函数可以用来在INTERVAL和字符串之间转
换:
incvasc(from,to)
把ANSI兼容的字符串转换为
INTERVAL值。
char*from;
指向数字和分隔符构成的源字符串
的指针。
intrvl_t*to;
指向已初始化的目的INTERVAL变
量的指针。
-1260无法转换
-1261在第一个域中有太多的数
字
-1262有非数值字符
-1263域超出范围
-1264结尾有多余字符
-1265溢出
incvfmtasc(from,fmt,to)
把公式化的字符串转换为
INTERVAL值。
char*from;
指向数字和分隔符构成的源字符串
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-16
的指针。
char*fmt;
指向格式字符串的指针:参见
DBTIME环境变量。
intrvl_t*to;
指向已初始化的目的INTERVAL变
量的指针。
intoasc(from,to)
把INTERVAL值转换成ANSI兼容的
字符串。
char*from;
指向已初始化的源INTERVAL值。
intrvl_t*to;
指向目的字符串的指针。
intofmtasc(from,to,len,fmt)
把INTERVAL值转换成格式化的
字符串。
char*from;
指向已初始化的源INTERVAL值。
intrvl_t*to;
指向目的字符串的指针。
intlen;
目的字符串的长度。
char*fmt;
指向格式字符串的指针:参见
DBTIME环境变量。
这四个函数返回:
0当操作成功时
<0当操作失败时
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-17
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
在DATEs和DATETIMEs
之间转换
te()
c()
nd()
nd()
c()
date()
DATETIME
DATE
没有在DATETIME和DATE类型之间直接转换的例程。但是,可
以使用ESQL/C提供的其它函数来完成。
为把一个DATE类型值转换为DATETIME值,象下面这样做:
1.声明一个带有修饰符yeartoday的DATETIME变量。
2.使用rfmtdate()函数把DATE值转换为一个字符串,使用的
模板是yyyy-mm-dd。
3.使用dtcvasc()函数把字符串转换为DATETIME类型变量里的
值。
4.如果需要的话,可以使用dtextend()函数来调整DATETIME
的修饰符。
为把一个DATETIME类型值转换为DATE值,象下面这样做:
1.使用dtextend()函数把DATETIME的修饰符调整为yearto
day。
2.使用dttoasc()函数,以模板yyyy-mm-dd创建一个字符串。
3.使用rdefmtdate()函数,以模板yyyy-mm-dd把字符串转换为
一个DATE值。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-18
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
DATETIME&INTERVAL
算术函数
这些函数提供DATETIME和INTERVAL的算术操作.
rdtaddinv
rdtsub
算术操作
.
ESQL/C库中有两个函数可以用来完成有关DATETIME和
INTERVAL值的运算:
rdtaddinv(dt,dg,in,iq,sum)
把一个INTERVAL值加到一个
DATETIME值上。
dec_t*dt;
指向DATETIME的DECIMAL部分
的指针。
intdq;
DATETIME的已初始化的修饰符部
分。
dec_t*in;
指向INTERVAL的DECIMAL部分
的指针。
intiq;
INTERVAL的已初始化的修饰符部
分。
dec_t*sum;
指向已初始化的DATETIME的
DECIMAL部分的指针。
rdtsub(dt2,dq2,dt1,dq1,dt0,dq0)
求两个DATETIME值的差。
dec_t*dt2;
指向被减的DATETIME值的
DECIMAL部分的指针。
intdq2;
被减的DATETIME值的已初始化的
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-19
修饰符部分。
dec_t*dt1;
指向减数DATETIME值的
DECIMAL部分的指针。
intdq1;
减数DATETIME值的已初始化的修
饰符部分。
dec_t*dt0;
指向结果DATETIME值的
DECIMAL部分的指针。
intdq0;
结果DATETIME值的修饰符部分。
为从一个DATETIME值减去一个INTERVAL值,只需要:
1.改变INTERVAL值的符号,即改变有关的dec_t结构的
dec_pos域。
2.调用rdtaddinv()函数,完成加法。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-20
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
DATETIME&INTERVAL
转换到DECIMAL
这些函数将DATETIME和INTERVAL转换为DECIMAL类型
rinvtodec
rdectoinv
转换为DECIMAL
.
ESQL/C库中有两个函数可以用来完成有关DATETIME和
INTERVAL值的其它运算:
rinvtodec(v,q,dec)
把INTERVAL或DATETIME类型值转
换成DECIMAL值。
dec_t*v;
指向INTERVAL或DATETIME值的
DECIMAL部分的指针。
intq;
INTERVAL或DATETIME值的已初始
化的修饰符。
dec_t*dec;
指向DECIMAL结果值的指针。
rdectoinv(dec,v,q)
把DECIMAL值转换成INTERVAL或
DATETIME类型值。
dec_t*dec;
指向源DECIMAL值的指针。
dec_t*v;
指向结果INTERVAL或DATETIME值
的DECIMAL部分的指针。
intq;
结果INTERVAL或DATETIME值的已
初始化的修饰符。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-21
这两个函数返回:
0当操作成功时
<0当操作失败时
正如我们前面所看到的那样,DATETIME和INTERVAL值有一个
DECIMAL部分,它的小数点后的有效位数是0。所以,当rinvtodec()
把这些值转换为DECIMAL类型时,结果的单位是修饰符的尾域。
例如,如果要把一个带有修饰符HOURTOMINUTE的
INTERVAL值转换为DECIMAL值,结果不会用小时来表示,而是用
分来表示。例如,如果要把INTERVAL值4:30转换为DECIMAL类
型,结果值不会是4.5小时;而是270分钟。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-22
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
DATETIME&INTERVAL
其它算术操作函数
使用前面这两个函数,可以对DATETIME和INTERVAL作其它算术操作
·两个INTERVALs相减
·将INTERVAL乘以或除以DECIMAL
·比较两个DATETIMEs或两个INTERVALs
例如,如果你需要将INTERVAL乘以DECIMAL,可按如下步骤进行
用rinvtodec()
转换
用decmul()
相乘
用rdectoinv()
转换
可以对DATETIME和INTERVAL类型完成其它的运算功能,例
如:
求两个INTERVAL值的商
用一个DECIMAL值去乘或除INTERVAL值
比较两个DATETIME值或INTERVAL值
为对DATETIME和INTERVAL值完成所有其它的运算,象下面
这样做:
1.使用rinvtodef()函数把DATETIME和INTERVAL值转换为
DECIMAL类型。
2.使用算术DECIMAL函数来完成运算。
3.使用rdectoinv()函数把DECIMAL结果转换回DATETIME和
INTERVAL类型。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-23
示例代码
$includedatetime;
main()
{
$intervalhour(3)tominuteProjTime;
$decimalHourlyRate,MinuteRate,MinutesPerHour,TimeDec,Pay;
interr;
charTime[16],Rate[16];
charPayStr[16];
/*makedecimalvalues*/
MakeDec("60",&MinutesPerHour);
MakeDec("18.75",&HourlyRate);
/*converthourlyrateintominute-rate*/
if(err=decdiv(&HourlyRate,&MinutesPerHour,&MinuteRate))
ErrExit(err,"decimalconversioNofhourlyratetominutes");
/*createintervalvalue*/
if(err=incvasc("21:30",&ProjTime))
ErrExit(err,"intervalconversionof'21:30'");
/*converttimeintervaltodecimalminutes*/
rinvtodec(&_dec,_qual,&TimeDec);
/*multiplyminutesbyminute-rate*/
if(err=decmul(&TimeDec,&MinuteRate,&Pay))
ErrExit(err,"multiplyingtwodecimals");
/*convertdecimalpaytostring*/
if(err=dectoasc(&Pay,PayStr,sizeof(PayStr),4))
ErrExit(err,"convertingpaydecimaltostring");
/*null-terminatesowecanprintit*/
ldchar(PayStr,sizeof(PayStr),PayStr);
printf("Pay='%s'
}
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-24
示例代码(续)
MakeDec(Str,Dec)
char*Str;
dec_t*Dec;
{
charMsg[]="decimalconversionof";
intErr;
if(Err=deccvasc(Str,stleng(Str),Dec)){
stcat(Str,Msg);
ErrExit(Err,Msg);
exit(-1);
}
}
ErrExit(Err,Msg)
intErr;
char*Msg;
{
printf("Error%don%s.n",Err,Msg);
exit(-1);
}
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-25
ESQL/C中使用DATETIME和INTERVAL数据类型融海咨询
练习
1.在使用"DAY(3)TODAY"限定词取INTERVAL数据
到4字节的字符串时会如何?
2.下面的宏的作用是什么?
TU_DTENCODE(TU_MONTH,TU_HOUR)
回答上面两个问题。
融海咨询
INFORMIX-ESQL/C
应用开发
ESQL/C中使用DATETIME和INTERVAL数据类型
12-26
答案
第21页
1.当从数据库字段中检索出一个DATETIME或INTERVAL值,
存放到字符宿主变量中时,数据库服务器完成隐式的转换工
作。如果,宿主变量足够大以存放转换后的值,则这就是结果。
如果太小,则溢出,变量用星号(*)来填充,sqlwarn1被设置
为W,并且,指示变量的值被设置1。
仅当是存放到字符类型的变量时,才进行隐式的转换;任何其
它的类型,除了DATETIME或INTERVAL类型,将会导致错误
的产生。
在该例子里,修饰符DAY(3)TODAY使得INTERVAL可以
多达999天。为把该值存放到字符数组中,该值本身需要3个字
符的位置,符号要一个字符位置,而且,空值结束符要一个字符
位置,总共是5个字节。我们的数组的大小是4,因此溢出。
如果我们定义的数组的大小是5,则得到一个INTERVAL值。
_DTENCODE宏为一个DATETIME值加上修饰符。在:
TU_DTENCODE(TU_MONTH,TU_HOUR)
中,宏加上一个MONTHTOHOUR修饰符。因为它返回一
个值,必须把它赋给一个整型变量,通常是dtime_t结构中的
dt_qual域,象下面这样:
$datetimeMyDTime;
_qual=TUENCODE(TU_MONTH,TU_DAY)
这两行代码等价于下面的声明:
$datetimemonthtodayMyDtime;
本文发布于:2022-12-29 00:04:39,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/49872.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |