interval

更新时间:2022-12-29 00:04:39 阅读: 评论:0


2022年12月29日发(作者:commonn)

融海咨询

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'n",PayStr);

}

融海咨询

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小时内删除。

标签:interval
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图