Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

36.6. pgtypes 库

36.6.1. 字符串
36.6.2. numeric类型
36.6.3. 日期类型
36.6.4. 时间戳类型
36.6.5. 区间类型
36.6.6. decimal类型
36.6.7. pgtypeslib 的 errno 值
36.6.8. pgtypeslib 的特殊常量

pgtypes 库将PostgreSQL数据库类型映射到 C 中等价的类型以便在 C 程序中使用。它还提供在 C 中对这些类型进行基本计算的函数,即不依赖PostgreSQL服务器进行计算。请看下面的例子:

EXEC SQL BEGIN DECLARE SECTION;
   date date1;
   timestamp ts1, tsout;
   interval iv1;
   char *out;
EXEC SQL END DECLARE SECTION;

PGTYPESdate_today(&date1);
EXEC SQL SELECT started, duration INTO :ts1, :iv1 FROM datetbl WHERE d=:date1;
PGTYPEStimestamp_add_interval(&ts1, &iv1, &tsout);
out = PGTYPEStimestamp_to_asc(&tsout);
printf("Started + duration: %s\n", out);
PGTYPESchar_free(out);

36.6.1. 字符串

PGTYPESnumeric_to_asc之类的一些函数返回一个新分配的字符串的指针。这些结果应该用PGTYPESchar_free而不是free释放(这只在Windows上很重要,因为Windows上的内存分配和释放有时候需要由同一个库完成)。

36.6.2. numeric类型

numeric类型用来完成对任意精度的计算。PostgreSQL服务器中等效的类型请见第 8.1 节。因为要用于任意精度,这种变量需要能够动态地扩展和收缩。这也是为什么你只能用PGTYPESnumeric_newPGTYPESnumeric_free函数在堆上创建numeric变量。decimal类型与numeric类型相似但是在精度上有限制,decimal类型可以在堆上创建也可以在栈上创建。

下列函数可以用于numeric类型:

PGTYPESnumeric_new

请求一个指向新分配的numeric变量的指针。

numeric *PGTYPESnumeric_new(void);

PGTYPESnumeric_free

释放一个numeric类型,释放它所有的内存。

void PGTYPESnumeric_free(numeric *var);

PGTYPESnumeric_from_asc

从字符串记号中解析一个numeric类型。

numeric *PGTYPESnumeric_from_asc(char *str, char **endptr);

例如,可用的格式是: -2.794+3.44592.49E07或者 -32.84e-4。 如果值能被成功地解析,将返回一个有效的指针,否则返回 NULL 指针。目前 ECPG 总是解析整个字符串并且因此当前不支持把第一个非法字符的地址存储在*endptr中。你可以安全地把endptr设置为 NULL。

PGTYPESnumeric_to_asc

返回由malloc分配的字符串的指针,它包含numeric类型num的字符串表达。

char *PGTYPESnumeric_to_asc(numeric *num, int dscale);

numeric值将被使用dscale小数位打印,必要时会圆整。结果必须用PGTYPESchar_free()释放。

PGTYPESnumeric_add

把两个numeric变量相加放到第三个numeric变量中。

int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);

该函数把变量var1var2相加放到结果变量result中。成功时该函数返回 0,出错时返回 -1。

PGTYPESnumeric_sub

把两个numeric变量相减并且把结果返回到第三个numeric变量。

int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);

该函数把变量var2从变量var1中减除。该操作的结果被存储在变量result中。成功时该函数返回 0,出错时返回 -1。

PGTYPESnumeric_mul

把两个numeric变量相乘并且把结果返回到第三个numeric变量。

int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);

该函数把变量var1var2相乘。该操作的结果被存储在变量result中。成功时该函数返回 0,出错时返回 -1。

PGTYPESnumeric_div

把两个numeric变量相除并且把结果返回到第三个numeric变量。

int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);

该函数用变量var2除变量var1。该操作的结果被存储在变量result中。成功时该函数返回 0,出错时返回 -1。

PGTYPESnumeric_cmp

比较两个numeric变量。

int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)

这个函数比较两个numeric变量。错误时会返回INT_MAX。成功时,该函数返回三种可能结果之一:

  • var1大于var2则返回 1

  • 如果var1小于var2则返回 -1

  • 如果var1var2相等则返回 0

PGTYPESnumeric_from_int

把一个整数变量转换成一个numeric变量。

int PGTYPESnumeric_from_int(signed int int_val, numeric *var);

这个函数接受一个有符号整型变量并且把它存储在numeric变量var中。成功时返回 0,失败时返回 -1。

PGTYPESnumeric_from_long

把一个长整型变量转换成一个numeric变量。

int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);

这个函数接受一个有符号长整型变量并且把它存储在numeric变量var中。成功时返回 0,失败时返回 -1。

PGTYPESnumeric_copy

把一个numeric变量复制到另一个中。

int PGTYPESnumeric_copy(numeric *src, numeric *dst);

这个函数把src指向的变量的值复制到dst指向的变量中。成功时该函数返回 0,出错时返回 -1。

PGTYPESnumeric_from_double

把一个双精度类型的变量转换成一个numeric变量。

int  PGTYPESnumeric_from_double(double d, numeric *dst);

这个函数接受一个双精度类型的变量并且把结果存储在dst指向的变量中。成功时该函数返回 0,出错时返回 -1。

PGTYPESnumeric_to_double

将一个numeric类型的变量转换成双精度。

int PGTYPESnumeric_to_double(numeric *nv, double *dp)

这个函数将nv指向的变量中的numeric值转换成dp指向的双精度变量。成功时该函数返回 0,出错时返回 -1(包括溢出)。溢出时,全局变量errno将被额外地设置成PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_int

将一个numeric类型的变量转换成整数。

int PGTYPESnumeric_to_int(numeric *nv, int *ip);

该函数将nv指向的变量的numeric值转换成ip指向的整数变量。成功时该函数返回 0,出错时返回 -1(包括溢出)。溢出时,全局变量errno将被额外地设置成PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_long

将一个numeric类型的变量转换成长整型。

int PGTYPESnumeric_to_long(numeric *nv, long *lp);

该函数将nv指向的变量的numeric值转换成ip指向的长整型变量。成功时该函数返回 0,出错时返回 -1(包括溢出)。溢出时,全局变量errno将被额外地设置成PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_decimal

将一个numeric类型的变量转换成decimal。

int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);

该函数将nv指向的变量的numeric值转换成ip指向的decimal变量。成功时该函数返回 0,出错时返回 -1(包括溢出)。溢出时,全局变量errno将被额外地设置成PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_from_decimal

将一个decimal类型的变量转换成numeric。

int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);

该函数将nv指向的变量的decimal值转换成ip指向的numeric变量。成功时该函数返回 0,出错时返回 -1(包括溢出)。因为decimal类型被实现为numeric类型的一个有限的版本,在这个转换上不会发生溢出。

36.6.3. 日期类型

C 中的日期类型允许你的程序处理 SQL 日期类型的数据。PostgreSQL服务器的等效类型可见第 8.5 节

下列函数可以被用于日期类型:

PGTYPESdate_from_timestamp

从一个时间戳中抽取日期部分。

date PGTYPESdate_from_timestamp(timestamp dt);

该函数接收一个时间戳作为它的唯一参数并且从这个时间戳返回抽取的日期部分。

PGTYPESdate_from_asc

从日期的文本表达解析一个日期。

date PGTYPESdate_from_asc(char *str, char **endptr);

该函数接收一个 C 的字符串str以及一个指向 C 字符串的指针endptr。当前 ECPG 总是解析完整的字符串并且因此当前不支持将第一个非法字符的地址存储在*endptr中。你可以安全地把endptr设置为 NULL。

注意该函数总是假定格式按照 MDY 格式化并且当前在 ECPG 中没有变体可以改变这种格式。

表 36.2展示了所有允许的输入格式。

表 36.2. PGTYPESdate_from_asc的合法输入格式

输入结果
January 8, 1999January 8, 1999
1999-01-08January 8, 1999
1/8/1999January 8, 1999
1/18/1999January 18, 1999
01/02/03February 1, 2003
1999-Jan-08January 8, 1999
Jan-08-1999January 8, 1999
08-Jan-1999January 8, 1999
99-Jan-08January 8, 1999
08-Jan-99January 8, 1999
08-Jan-06January 8, 2006
Jan-08-99January 8, 1999
19990108ISO 8601; January 8, 1999
990108ISO 8601; January 8, 1999
1999.008年以及积日
J2451187儒略日
January 8, 99 BC公元前 99 年

PGTYPESdate_to_asc

返回一个日期变量的文本表达。

char *PGTYPESdate_to_asc(date dDate);

该函数接收日期dDate作为它的唯一参数。它将以形式1999-01-18输出该日期,即以YYYY-MM-DD格式输出。结果必须用PGTYPESchar_free()释放。

PGTYPESdate_julmdy

从一个日期类型变量中抽取日、月和年的值。

void PGTYPESdate_julmdy(date d, int *mdy);

该函数接收日期d以及一个指向有 3 个整数值的数组mdy的指针。变量名就表明了顺序:mdy[0]将被设置为包含月份,mdy[1]将被设置为日的值,而mdy[2]将包含年。

PGTYPESdate_mdyjul

从一个由 3 个整数构成的数组创建一个日期值,3 个整数分别指定日、月和年。

void PGTYPESdate_mdyjul(int *mdy, date *jdate);

这个函数接收 3 个整数(mdy)组成的数组作为其第一个参数,其第二个参数是一个指向日期类型变量的指针,它被用来保存操作的结果。

PGTYPESdate_dayofweek

为一个日期值返回表示它是星期几的数字。

int PGTYPESdate_dayofweek(date d);

这个函数接收日期变量d作为它唯一的参数并且返回一个整数说明这个日期是星期几。

  • 0 - 星期日

  • 1 - 星期一

  • 2 - 星期二

  • 3 - 星期三

  • 4 - 星期四

  • 5 - 星期五

  • 6 - 星期六

PGTYPESdate_today

得到当前日期。

void PGTYPESdate_today(date *d);

该函数接收一个指向一个日期变量(d)的指针并且把该参数设置为当前日期。

PGTYPESdate_fmt_asc

使用一个格式掩码将一个日期类型的变量转换成它的文本表达。

int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);

该函数接收要转换的日期(dDate)、格式掩码(fmtstring)以及将要保存日期的文本表达的字符串(outbuf)。

成功时,返回 0;如果发生错误,则返回一个负值。

下面是你可以使用的域指示符:

  • dd - 一个月中的第几天。

  • mm - 一年中的第几个月。

  • yy - 两位数的年份。

  • yyyy - 四位数的年份。

  • ddd - 星期几的名称(简写)。

  • mmm - 月份的名称(简写)。

所有其他字符会被原封不动地复制到输出字符串中。

表 36.3指出了一些可能的格式。这将给你一些线索如何使用这个函数。所有输出都是基于同一个日期:1959年11月23日。

表 36.3. PGTYPESdate_fmt_asc的合法输入格式

格式结果
mmddyy112359
ddmmyy231159
yymmdd591123
yy/mm/dd59/11/23
yy mm dd59 11 23
yy.mm.dd59.11.23
.mm.yyyy.dd..11.1959.23.
mmm. dd, yyyyNov. 23, 1959
mmm dd yyyyNov 23 1959
yyyy dd mm1959 23 11
ddd, mmm. dd, yyyyMon, Nov. 23, 1959
(ddd) mmm. dd, yyyy(Mon) Nov. 23, 1959

PGTYPESdate_defmt_asc

使用一个格式掩码把一个 C 的 char*子返回串转换成一个日期类型的值。

int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);

该函数接收一个用来保存操作结果的指向日期值的指针(d)、用于解析日期的格式掩码(fmt)以及包含日期文本表达的 C char* 串(str)。该函数期望文本表达匹配格式掩码。不过你不需要字符串和格式掩码的一一映射。该函数只分析相继顺序并且查找表示年份位置的文字yy或者yyyy、表示月份位置的mm以及表示日位置的dd

表 36.4给出了一些可能的格式。这将给你一些线索如何使用这个函数。

表 36.4. rdefmtdate的合法输入格式

格式字符串结果
ddmmyy21-2-541954-02-21
ddmmyy2-12-541954-12-02
ddmmyy201119541954-11-20
ddmmyy1304641964-04-13
mmm.dd.yyyyMAR-12-19671967-03-12
yy/mm/dd1954, February 3rd1954-02-03
mmm.dd.yyyy0412691969-04-12
yy/mm/dd在 2525 年的七月二十八日,人类还将存在2525-07-28
dd-mm-yy也是 2525 年七月的二十八日2525-07-28
mmm.dd.yyyy9/14/581958-09-14
yy/mm/dd47/03/291947-03-29
mmm.dd.yyyyoct 28 19751975-10-28
mmddyyNov 14th, 19851985-11-14

36.6.4. 时间戳类型

C 中的时间戳类型允许你的程序处理 SQL 时间戳类型的数据。PostgreSQL服务器的等效类型可见第 8.5 节

下列函数可用于处理时间戳类型:

PGTYPEStimestamp_from_asc

从其文本表示中解析时间戳为时间戳变量。

timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr);

该函数接收要解析的字符串(str)和一个指向C char*的指针(endptr)。 目前,ECPG总是解析完整的字符串,因此目前不支持存储第一个无效字符的地址在*endptr中。 您可以安全地将endptr设置为NULL。

该函数在成功时返回解析后的时间戳。发生错误时,返回PGTYPESInvalidTimestamp, 并将errno设置为PGTYPES_TS_BAD_TIMESTAMP。 有关此值的重要说明,请参见PGTYPESInvalidTimestamp

通常,输入字符串可以包含允许的日期规范、空白字符和允许的时间规范的任意组合。请注意,ECPG 不支持时区。它可以解析时区,但不像PostgreSQL服务器那样应用任何计算。时区标识符会被静默丢弃。

表 36.5包含了一些输入字符串的示例。

表 36.5. PGTYPEStimestamp_from_asc的有效输入格式

输入结果
1999-01-08 04:05:061999-01-08 04:05:06
January 8 04:05:06 1999 PST1999-01-08 04:05:06
1999-Jan-08 04:05:06.789-81999-01-08 04:05:06.789 (time zone specifier ignored)
J2451187 04:05-08:001999-01-08 04:05:00 (time zone specifier ignored)

PGTYPEStimestamp_to_asc

将日期转换为C char*字符串。

char *PGTYPEStimestamp_to_asc(timestamp tstamp);

该函数接收时间戳tstamp作为其唯一参数,并返回一个包含时间戳文本表示的已分配字符串。 结果必须使用PGTYPESchar_free()释放。

PGTYPEStimestamp_current

检索当前时间戳。

void PGTYPEStimestamp_current(timestamp *ts);

该函数检索当前时间戳,并将其保存到ts指向的时间戳变量中。

PGTYPEStimestamp_fmt_asc

将时间戳变量转换为C char*,使用格式掩码。

int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);

该函数接收一个指向要转换的时间戳的指针作为第一个参数(ts), 一个指向输出缓冲区的指针(output),已为输出缓冲区分配的最大长度 (str_len),以及用于转换的格式掩码(fmtstr)。

当成功时,该函数返回0,如果发生错误则返回负值。

您可以使用以下格式说明符来格式化掩码。格式说明符与libc中的strftime函数中使用的相同。任何非格式说明符都将被复制到输出缓冲区中。

  • %A - 被替换为完整星期几的国家表示形式。

  • %a - 被缩写的星期几名称的国家表示形式所替换。

  • %B - 被替换为完整月份名称的国家表示形式。

  • %b - 被缩写月份的国家表示形式替换。

  • %C - 被(年份 / 100)替换为十进制数;单个数字前面加零。

  • %c - 被时间和日期的国家表示形式替换。

  • %D - 等同于 %m/%d/%y

  • %d - 被月份的日期替换为十进制数字(01-31)。

  • %E* %O* - POSIX 本地化扩展。序列 %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy 应该提供替代表示。

    另外%OB用于表示替代的月份名称(单独使用,不包括日期)。

  • %e - 被一个十进制数字(1-31)替换;单个数字前面有一个空格。

  • %F - 等同于%Y-%m-%d

  • %G - 被一个包含世纪的十进制数字年份替换。这一年是包含大部分周的那一年(以周一作为一周的第一天)。

  • %g - 被替换为与%G相同的年份,但作为一个没有世纪的十进制数 (00–99)。

  • %H - 被小时(24小时制)替换为十进制数(00-23)。

  • %h - 与%b相同。

  • %I - 被小时(12小时制)替换为十进制数(01-12)。

  • %j - 被一年中的日期替换为十进制数(001–366)。

  • %k - 被小时(24小时制)表示为十进制数(0-23);单个数字前面有一个空格。

  • %l - 被小时(12小时制)替换为十进制数(1-12);单个数字前面有一个空格。

  • %M - 被分钟替换为十进制数(00-59)。

  • %m - 被月份的十进制数(01-12)替换。

  • %n - 被换行符替换。

  • %O* - 与%E*相同。

  • %p - 被适当地替换为上午下午的国家表示形式。

  • %R - 等同于%H:%M

  • %r - 等同于%I:%M:%S %p

  • %S - 被第二个作为十进制数(00-60)替换。

  • %s - 被替换为自纪元时以来的秒数,协调世界时。

  • %T - 等同于%H:%M:%S

  • %t - 被替换为一个制表符。

  • %U - 被一年中的周数替换(以周日作为一周的第一天),表示为十进制数(00-53)。

  • %u - 被星期几(以星期一作为一周的第一天)替换为十进制数(1-7)。

  • %V - 被一年中的周数替换(以星期一作为一周的第一天), 表示为十进制数(01-53)。如果包含1月1日的那一周在新年有四天或更多天, 那么它是第1周;否则它是上一年的最后一周,下一周是第1周。

  • %v - 等同于 %e-%b-%Y

  • %W - 被一年中的周数替换(以周一作为一周的第一天),表示为十进制数(00-53)。

  • %w - 被星期几替换(星期日作为一周的第一天)作为十进制数(0-6)。

  • %X - 被时间的国家表示替换。

  • %x - 被日期的国家表示形式替换。

  • %Y - 被年份替换,包括世纪,以十进制数表示。

  • %y - 被年份替换,不包括世纪,以十进制数表示(00-99)。

  • %Z - 被时区名称替换。

  • %z - 被UTC时间偏移替换;前导加号表示UTC东部,减号表示UTC西部,后跟两位数字的小时和分钟,它们之间没有分隔符(RFC 822日期头的常见形式)。

  • %+ - 被日期和时间的国家表示所替换。

  • %-* - GNU libc扩展。在执行数字输出时不进行任何填充。

  • $_* - GNU libc扩展。明确指定填充空间。

  • %0* - GNU libc扩展。显式地指定零来填充。

  • %% - 被%替换。

PGTYPEStimestamp_sub

从一个时间戳减去另一个时间戳,并将结果保存在一个间隔类型的变量中。

int PGTYPEStimestamp_sub(timestamp *ts1, timestamp *ts2, interval *iv);

该函数将从时间戳变量ts1指向的时间戳变量中减去时间戳变量ts2指向的时间戳变量,并将结果存储在间隔变量iv指向的间隔变量中。

当成功时,该函数返回0,如果发生错误则返回负值。

PGTYPEStimestamp_defmt_asc

通过使用格式掩码从其文本表示中解析时间戳值。

int PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d);

该函数接收时间戳的文本表示,存储在变量str中,以及要在变量fmt中使用的格式掩码。 结果将存储在d指向的变量中。

如果格式掩码fmt为NULL,则函数将回退到默认的格式掩码,即%Y-%m-%d %H:%M:%S

这是与PGTYPEStimestamp_fmt_asc相反的函数。请参阅那里的文档,以了解可能的格式掩码条目。

PGTYPEStimestamp_add_interval

向时间戳变量添加一个间隔变量。

int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);

该函数接收一个指向时间戳变量tin的指针和一个指向间隔变量span的指针。 它将间隔添加到时间戳中,并将结果时间戳保存在tout指向的变量中。

当成功时,该函数返回0,如果发生错误则返回负值。

PGTYPEStimestamp_sub_interval

从时间戳变量中减去一个时间间隔变量。

int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);

该函数从span指向的时间间隔变量中减去tin指向的时间戳变量,并将结果保存到tout指向的变量中。

当成功时,该函数返回0,如果发生错误则返回负值。

36.6.5. 区间类型

C 中的区间类型允许你的程序处理 SQL 区间类型的数据。PostgreSQL服务器的等效类型可见第 8.5 节

下列函数可以用于区间类型:

PGTYPESinterval_new

返回一个指向新分配的区间变量的指针。

interval *PGTYPESinterval_new(void);

PGTYPESinterval_free

释放先前分配的区间变量的内存。

void PGTYPESinterval_free(interval *intvl);

PGTYPESinterval_from_asc

从文本表达解析一个区间。

interval *PGTYPESinterval_from_asc(char *str, char **endptr);

该函数解析输入字符串str并且返回一个已分配的区间变量的指针。目前 ECPG 总是解析整个字符串并且因此当前不支持把第一个非法字符的地址存储在*endptr中。你可以安全地把endptr设置为 NULL。

PGTYPESinterval_to_asc

将一个区间类型的变量转换成它的文本表达。

char *PGTYPESinterval_to_asc(interval *span);

该函数将span指向的区间变量转换成一个 C char*。输出看起来像这个例子: @ 1 day 12 hours 59 mins 10 secs。结果必须用PGTYPESchar_free()释放。

PGTYPESinterval_copy

复制一个区间类型的变量。

int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);

该函数将intvlsrc指向的区间变量复制到intvldest指向的区间变量。注意你需要现为目标变量分配好内存。

36.6.6. decimal类型

decimal类型和numeric类型相似。不过,它被限制为最大精度是 30 个有效位。与numeric类型只能在堆上创建相反,decimal类型既可以在栈上也可以在堆上创建(使用函数PGTYPESdecimal_newPGTYPESdecimal_free)。在第 36.15 节中描述的Informix兼容模式中有很多其它函数可以处理decimal类型。

下列函数可以被用于decimal类型并且不仅被包含于libcompat库中。

PGTYPESdecimal_new

要求一个指向新分配的decimal变量的指针。

decimal *PGTYPESdecimal_new(void);

PGTYPESdecimal_free

释放一个decimal类型,释放它的所有内存。

void PGTYPESdecimal_free(decimal *var);

36.6.7. pgtypeslib 的 errno 值

PGTYPES_NUM_BAD_NUMERIC

一个参数应该包含一个numeric变量(或者指向一个numeric变量),但是实际上它的内存表达非法。

PGTYPES_NUM_OVERFLOW

发生一次溢出。由于numeric类型可以处理几乎任何精度,将一个numeric变量转换成其他类型可能导致溢出。

PGTYPES_NUM_UNDERFLOW

发生一次下溢。由于numeric类型可以处理几乎任何精度,将一个numeric变量转换成其他类型可能导致下溢。

PGTYPES_NUM_DIVIDE_ZERO

尝试了一次除零。

PGTYPES_DATE_BAD_DATE

一个非法的日期字符串被传给了PGTYPESdate_from_asc函数。

PGTYPES_DATE_ERR_EARGS

非法参数被传给了PGTYPESdate_defmt_asc函数。

PGTYPES_DATE_ERR_ENOSHORTDATE

PGTYPESdate_defmt_asc函数在输入字符串中发现了一个非法记号。

PGTYPES_INTVL_BAD_INTERVAL

一个非法的区间字符串被传给了PGTYPESinterval_from_asc函数,或者一个非法的区间值被传给了PGTYPESinterval_to_asc函数。

PGTYPES_DATE_ERR_ENOTDMY

PGTYPESdate_defmt_asc函数中有日/月/年不匹配的赋值。

PGTYPES_DATE_BAD_DAY

PGTYPESdate_defmt_asc函数发现了月中的一个非法日值。

PGTYPES_DATE_BAD_MONTH

PGTYPESdate_defmt_asc函数发现了一个非法的月值。

PGTYPES_TS_BAD_TIMESTAMP

一个非法的时间戳字符串被传给了PGTYPEStimestamp_from_asc函数,或者一个非法的时间戳值被传给了PGTYPEStimestamp_to_asc函数。

PGTYPES_TS_ERR_EINFTIME

在一个无法处理无限时间戳值的环境中遇到了这样一个值。

36.6.8. pgtypeslib 的特殊常量

PGTYPESInvalidTimestamp

表示一个非法时间戳的时间戳类型值。在解析错误时,函数PGTYPEStimestamp_from_asc会返回这个值。注意由于timestamp数据类型的内部表达,PGTYPESInvalidTimestamp在同时也是一个合法的时间戳。它被设置为1899-12-31 23:59:59。为了检测到错误,确认你的应用在每次调用PGTYPEStimestamp_from_asc后不仅仅测试PGTYPESInvalidTimestamp,还应该测试errno != 0