在AGE中实现date()函数的技术方案咨询
在AGE中实现date()函数的解决方案
用户问题
我正尝试在AGE中实现date()函数,但C语言没有可直接调用的内置日期函数。我考虑借助
age_timestamp()函数并将其输出转换为日期格式,但尚未找到该转换的具体算法。现有代码片段:
Datum age_date(PG_FUNCTION_ARGS) { agtype time = age_timestamp() // Program Logic }请问是否存在其他可在AGE中实现所需日期功能的方法?
可行实现方法
方法一:复用PostgreSQL内置日期处理能力
AGE基于PostgreSQL构建,直接使用PG原生的日期转换逻辑是最高效的方案:
- 调用
GetCurrentTimestamp()获取标准PG时间戳类型(比age_timestamp()更适配PG的日期处理链) - 通过
timestamp2date()将时间戳直接转换为PG的DateADT日期类型 - 完整可运行代码:
#include "postgres.h" #include "utils/date.h" #include "utils/timestamp.h" PG_FUNCTION_INFO_V1(age_date); Datum age_date(PG_FUNCTION_ARGS) { TimestampTz current_ts = GetCurrentTimestamp(); DateADT date_result = timestamp2date(current_ts); PG_RETURN_DATE(date_result); }
方法二:基于age_timestamp()的转换实现
如果必须依赖age_timestamp()的输出,可按以下步骤完成转换:
- 正确调用
age_timestamp()获取agtype格式的时间戳(需用DirectFunctionCall1调用PG函数) - 将
agtype转换为C字符串,再用PG的parse_iso8601_timestamp()解析为标准时间戳 - 转换为日期类型后返回
代码示例:
#include "postgres.h" #include "utils/date.h" #include "utils/timestamp.h" #include "agtype.h" #include "funcapi.h" PG_FUNCTION_INFO_V1(age_date); Datum age_date(PG_FUNCTION_ARGS) { // 调用age_timestamp获取agtype格式的当前时间 Datum ts_datum = DirectFunctionCall1(age_timestamp, (Datum)0); agtype *ts_agtype = DatumGetAGType(ts_datum); // 提取agtype的字符串表示 char *ts_str = AGTypeGetCString(ts_agtype); TimestampTz parsed_ts; // 解析ISO8601格式字符串为PG时间戳 if (!parse_iso8601_timestamp(ts_str, strlen(ts_str), &parsed_ts)) { ereport(ERROR, (errcode(ERRCODE_INVALID_DATETIME_FORMAT), errmsg("Failed to parse timestamp from agtype"))); } // 转换为日期并释放临时字符串 DateADT date_result = timestamp2date(parsed_ts); pfree(ts_str); PG_RETURN_DATE(date_result); }
方法三:复用AGE内置时间转换工具
AGE的src/backend/utils/adt/agtype_timestamp.c中提供了agtype_timestamp_to_timestamp()函数,可直接将agtype时间戳转换为PG的TimestampTz类型,省去手动解析字符串的步骤,进一步简化代码。
内容的提问来源于stack exchange,提问作者Muhammad Abdullah
相关产品推荐
相关产品推荐

