我在 CENTOS 上使用 postgreSQL-9.1.6。
我在to_date函数上有问题,比如......
postgres=# select to_date('20130229','yyyymmdd');
to_date
------------
2013-03-01
(1 row)
所以我正在尝试针对传入日期添加超出范围的验证检查。
postgres=#select to_date('20130229','yyyymmdd');
错误:时间戳超出范围
我从这里找到了一个提示,但它没有用,我在这里问。不幸的是,我无法得到答案。
最后,我得出了另一个结论。下面是我的formatting.c,其中添加了9行标记+
。
Datum
to_date(PG_FUNCTION_ARGS)
{
text *date_txt = PG_GETARG_TEXT_P(0);
text *fmt = PG_GETARG_TEXT_P(1);
DateADT result;
struct pg_tm tm;
fsec_t fsec;
+ int ndays[]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
+ int last_day_of_month;
do_to_timestamp(date_txt, fmt, &tm, &fsec);
+ last_day_of_month = ndays[tm.tm_mon];
+ if (((tm.tm_year & 3) == 0 && ((tm.tm_year % 25) != 0 || (tm.tm_year & 15) == 0)) && tm.tm_mon == 2 )
+ last_day_of_month = ndays[tm.tm_mon] + 1;
+ if( tm.tm_mon > 12 || tm.tm_mon < 1 || tm.tm_mday > last_day_of_month || tm.tm_mday < 1
)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
result = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) - POSTGRES_EPOCH_JDATE;
PG_RETURN_DATEADT(result);
}
虽然我自己的formatting.c效果很好,但我不确定它是否完美。我担心会出现意外结果,例如针对有效日期抛出错误。
任何建议将不胜感激。