36.6. pgtypes 库#
- 36.6.1. 字符串
- 36.6.2. numeric 类型
- 36.6.3. date 类型
- 36.6.4. timestamp 类型
- 36.6.5. interval 类型
- 36.6.6. 十进制类型
- 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_new和PGTYPESnumeric_free函数在堆上创建 numeric 变量的原因。decimal 类型与 numeric 类似,但精度有限,可以在堆栈和堆上创建。
可以使用以下函数处理 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.44、592.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 变量添加到第三个变量中。
int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);
该函数将变量
var1和var2添加到结果变量result中。该函数在成功时返回 0,在出错时返回 -1。PGTYPESnumeric_sub#减去两个数字变量,并将结果返回到第三个变量中。
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);
该函数从变量
var1中减去变量var2。操作结果存储在变量result中。该函数在成功时返回 0,在出错时返回 -1。PGTYPESnumeric_mul#将两个数字变量相乘,并将结果返回到第三个变量中。
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);
该函数将变量
var1和var2相乘。操作结果存储在变量result中。该函数在成功时返回 0,在出错时返回 -1。PGTYPESnumeric_div#将两个数字变量相除,并将结果返回到第三个变量中。
int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);
该函数将变量
var1除以var2。操作结果存储在变量result中。该函数在成功时返回 0,在出错时返回 -1。PGTYPESnumeric_cmp#比较两个数字变量。
int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)
该函数比较两个数字变量。如果出错,则返回
INT_MAX。如果成功,则该函数返回三个可能的结果之一1,如果
var1大于var2-1,如果
var1小于var20,如果
var1和var2相等
PGTYPESnumeric_from_int#将 int 变量转换为数字变量。
int PGTYPESnumeric_from_int(signed int int_val, numeric *var);
此函数接受类型为有符号 int 的变量,并将其存储在数字变量
var中。成功时,返回 0,失败时返回 -1。PGTYPESnumeric_from_long#将 long int 变量转换为数字变量。
int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);
此函数接受类型为有符号 long int 的变量,并将其存储在数字变量
var中。成功时,返回 0,失败时返回 -1。PGTYPESnumeric_copy#将一个数字变量复制到另一个数字变量中。
int PGTYPESnumeric_copy(numeric *src, numeric *dst);
此函数将
src指向的变量的值复制到dst指向的变量中。成功时返回 0,如果发生错误则返回 -1。PGTYPESnumeric_from_double#将类型为 double 的变量转换为数字。
int PGTYPESnumeric_from_double(double d, numeric *dst);
此函数接受类型为 double 的变量,并将结果存储在
dst指向的变量中。成功时返回 0,如果发生错误则返回 -1。PGTYPESnumeric_to_double#将类型为数字的变量转换为 double。
int PGTYPESnumeric_to_double(numeric *nv, double *dp)
此函数将
nv指向的变量中的数字值转换为dp指向的 double 变量。成功时返回 0,如果发生错误则返回 -1,包括溢出。溢出时,全局变量errno将另外设置为PGTYPES_NUM_OVERFLOW。PGTYPESnumeric_to_int#将类型为数字的变量转换为 int。
int PGTYPESnumeric_to_int(numeric *nv, int *ip);
此函数将
nv指向的变量中的数字值转换为ip指向的整数变量。成功时返回 0,如果发生错误则返回 -1,包括溢出。溢出时,全局变量errno将另外设置为PGTYPES_NUM_OVERFLOW。PGTYPESnumeric_to_long#将类型为数字的变量转换为 long。
int PGTYPESnumeric_to_long(numeric *nv, long *lp);
此函数将
nv指向的变量中的数字值转换为lp指向的长整数变量。成功时返回 0,如果发生错误则返回 -1,包括溢出。溢出时,全局变量errno将另外设置为PGTYPES_NUM_OVERFLOW。PGTYPESnumeric_to_decimal#将类型为数字的变量转换为 decimal。
int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);
该函数将
src指向的变量中的数字值转换为dst指向的十进制变量。如果成功,则返回 0,如果出现错误(包括溢出),则返回 -1。如果溢出,则全局变量errno还将设置为PGTYPES_NUM_OVERFLOW。PGTYPESnumeric_from_decimal#将 decimal 类型的变量转换为 numeric。
int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);
该函数将
src指向的变量中的十进制值转换为dst指向的数字变量。如果成功,则返回 0,如果出现错误,则返回 -1。由于 decimal 类型是 numeric 类型的受限版本,因此此转换不会发生溢出。
36.6.3. 日期类型#
C 中的日期类型使您的程序能够处理 SQL 类型 date 的数据。有关PostgreSQL服务器中同等类型的详细信息,请参见第 8.5 节。
可以使用以下函数处理日期类型
PGTYPESdate_from_timestamp#从时间戳中提取日期部分。
date PGTYPESdate_from_timestamp(timestamp dt);
该函数接收时间戳作为其唯一参数,并从该时间戳中返回提取的日期部分。
PGTYPESdate_from_asc#从其文本表示形式解析日期。
date PGTYPESdate_from_asc(char *str, char **endptr);
该函数接收 C char* 字符串
str和指向 C char* 字符串endptr的指针。目前,ECPG 始终解析完整字符串,因此当前不支持将第一个无效字符的地址存储在*endptr中。您可以安全地将endptr设置为 NULL。请注意,该函数始终假定 MDY 格式的日期,并且 ECPG 中当前没有变量可以更改此格式。
表 36.2 显示了允许的输入格式。
表 36.2.
PGTYPESdate_from_asc的有效输入格式输入 结果 1999 年 1 月 8 日1999 年 1 月 8 日1999-01-081999 年 1 月 8 日1/8/19991999 年 1 月 8 日1/18/19991999 年 1 月 18 日01/02/032003 年 2 月 1 日1999-01-081999 年 1 月 8 日08-01-19991999 年 1 月 8 日08-01-19991999 年 1 月 8 日99-01-081999 年 1 月 8 日08-01-991999 年 1 月 8 日08-01-062006 年 1 月 8 日08-01-991999 年 1 月 8 日19990108ISO 8601;1999 年 1 月 8 日990108ISO 8601;1999 年 1 月 8 日1999.008年份和年中的天数J2451187儒略日公元前 99 年 1 月 8 日公元前 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 个整数数组创建一个日期值。
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- 月份名称(缩写)。
所有其他字符都按 1:1 复制到输出字符串。
表 36.3 指示了一些可能的格式。这将让你了解如何使用此函数。所有输出行都基于同一天:1959 年 11 月 23 日。
表 36.3。
PGTYPESdate_fmt_asc的有效输入格式格式 结果 mmddyy112359ddmmyy231159yymmdd591123yy/mm/dd59/11/23yy mm dd59 11 23yy.mm.dd59.11.23.mm.yyyy.dd..11.1959.23.mmm. dd, yyyyNov. 23, 1959mmm dd yyyyNov 23 1959yyyy dd mm1959 23 11ddd, mmm. dd, yyyyMon, Nov. 23, 1959(ddd) mmm. dd, yyyy(Mon) Nov. 23, 1959PGTYPESdate_defmt_asc#使用格式掩码将 C
char*字符串转换为类型为日期的值。int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);
该函数接收一个指针,指向应保存操作结果的日期值 (
d)、用于解析日期的格式掩码 (fmt) 和包含日期文本表示形式的 C char* 字符串 (str)。文本表示形式应与格式掩码匹配。但是,您不需要字符串与格式掩码之间进行 1:1 映射。该函数仅分析顺序,并查找指示年份位置的文字yy或yyyy、指示月份位置的mm和指示日期位置的dd。表 36.4 指示了一些可能的格式。这将让您了解如何使用此函数。
表 36.4。
rdefmtdate的有效输入格式格式 字符串 结果 ddmmyy21-2-541954-02-21ddmmyy2-12-541954-12-02ddmmyy201119541954-11-20ddmmyy1304641964-04-13mmm.dd.yyyyMAR-12-19671967-03-12yy/mm/dd1954, February 3rd1954-02-03mmm.dd.yyyy0412691969-04-12yy/mm/ddIn the year 2525, in the month of July, mankind will be alive on the 28th day2525-07-28dd-mm-yyI said on the 28th of July in the year 25252525-07-28mmm.dd.yyyy9/14/581958-09-14yy/mm/dd47/03/291947-03-29mmm.dd.yyyyoct 28 19751975-10-28mmddyyNov 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:061999 年 1 月 8 日 04:05:06 PST1999-01-08 04:05:061999-01-08 04:05:06.789-81999-01-08 04:05:06.789(忽略时区说明符)J2451187 04:05-08:001999-01-08 04:05:00(忽略时区说明符)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- 替换为自纪元时间(UTC)以来的秒数。%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#从另一个时间戳中减去一个时间戳,并将结果保存在类型为 interval 的变量中。
int PGTYPEStimestamp_sub(timestamp *ts1, timestamp *ts2, interval *iv);
该函数将
ts2指向的时间戳变量从ts1指向的时间戳变量中减去,并将结果存储在iv指向的 interval 变量中。成功后,该函数返回 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#向时间戳变量添加一个 interval 变量。
int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);
该函数接收一个指向时间戳变量
tin的指针和一个指向 interval 变量span的指针。它将 interval 添加到时间戳,并将结果时间戳保存在tout指向的变量中。成功后,该函数返回 0,如果发生错误,则返回负值。
PGTYPEStimestamp_sub_interval#从时间戳变量中减去一个 interval 变量。
int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
该函数从
tin指向的时间戳变量中减去span指向的 interval 变量,并将结果保存到tout指向的变量中。成功后,该函数返回 0,如果发生错误,则返回负值。
36.6.5. interval 类型#
C 中的 interval 类型使您的程序能够处理 SQL 类型 interval 的数据。有关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. 十进制类型#
十进制类型与数字类型类似。但是,它的有效数字的最大精度限制为 30 位。与只能在堆上创建的数字类型不同,十进制类型可以在堆上或栈上创建(通过函数PGTYPESdecimal_new和PGTYPESdecimal_free)。在第 36.15 节中描述的Informix兼容模式中,还有许多其他函数处理十进制类型。
可以使用以下函数处理十进制类型,它们不仅包含在libcompat库中。
PGTYPESdecimal_new#请求指向新分配的十进制变量的指针。
decimal *PGTYPESdecimal_new(void);
PGTYPESdecimal_free#释放十进制类型,释放其所有内存。
void PGTYPESdecimal_free(decimal *var);
36.6.7. pgtypeslib 的 errno 值#
PGTYPES_NUM_BAD_NUMERIC#参数应包含一个数字变量(或指向一个数字变量),但实际上它的内存中表示无效。
PGTYPES_NUM_OVERFLOW#发生溢出。由于数字类型可以处理几乎任意精度,因此将数字变量转换为其他类型可能会导致溢出。
PGTYPES_NUM_UNDERFLOW#发生下溢。由于数字类型可以处理几乎任意精度,因此将数字变量转换为其他类型可能会导致下溢。
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。为了检测错误,请确保您的应用程序不仅测试PGTYPESInvalidTimestamp,还测试errno != 0,每次调用PGTYPEStimestamp_from_asc之后。
