如何解读通过libpq二进制模式获取的PostgreSQL date类型4字节数据?
解读PostgreSQL二进制返回的DateADT类型值
PostgreSQL的date类型在二进制模式下返回的4字节数据,对应src/include/utils/date.h中定义的DateADT(即int32类型),解读规则非常直接:
- 这个整数是相对于PostgreSQL内部纪元日期
2000-01-01的偏移天数- 正数表示
2000-01-01之后的天数 - 负数表示
2000-01-01之前的天数
- 正数表示
验证你的值8332
你可以直接在PostgreSQL中执行SQL验证对应的日期:
SELECT '2000-01-01'::date + 8332;
执行后得到的结果就是该二进制值对应的实际日期。
代码中处理的注意点
通过libpq获取二进制数据时,注意PostgreSQL返回的是网络字节序(大端),需要转换为主机字节序后再计算:
#include <netinet/in.h> // 用于ntohl() // 假设res是查询结果,行索引0,列索引18是date列 const char* date_bin = PQgetvalue(res, 0, 18); int32_t date_offset = ntohl(*(const int32_t*)date_bin); // date_offset即为偏移天数,基于2000-01-01计算日期
关于你之前的错误值1466004328
这个值是Unix时间戳(对应2022-10-25的某个时刻),属于你错误引用的文本列返回的二进制数据(可能该列存储的是时间戳字符串,二进制模式下被解析成了整数),和date类型的存储规则无关。
内容的提问来源于stack exchange,提问作者myk
相关产品推荐
相关产品推荐

