You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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()的输出,可按以下步骤完成转换:

  1. 正确调用age_timestamp()获取agtype格式的时间戳(需用DirectFunctionCall1调用PG函数)
  2. 将agtype转换为C字符串,再用PG的parse_iso8601_timestamp()解析为标准时间戳
  3. 转换为日期类型后返回
    代码示例:
#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:42:23