我有一些 C 代码可以OCIDate
从纪元时间填充一个:
在我的主程序中:
OCIDate ocidate;
epoch_to_ocidate(c.f, &ocidate);
在图书馆:
void epoch_to_ocidate(double d, OCIDate* ocidate) {
time_t t = (time_t)d;
struct tm *ut = localtime(&t); /* convert to a Unix time */
OCIDateSetDate(ocidate, ut->tm_year + 1900, ut->tm_mon + 1, ut->tm_mday);
OCIDateSetTime(ocidate, ut->tm_hour + 1, ut->tm_min + 1, ut->tm_sec + 1);
}
我很确定这是正确的,因为我在调用例程中进行了检查:
#ifdef DEBUG
char* fmt = "DD-MON-YYYY HH24:MI:SS";
ub4 dbufsize=255;
debug("testing converted OCIDate:");
OCIDateToText(h.err, (const OCIDate*)&ocidate, (text*)fmt, (ub1)strlen(fmt), (text*)0, (ub4)0, &dbufsize, (text*)dbuf);
debug(dbuf);
#endif
我将它与以下内容绑定:
OCIBindByPos(s, &bh, h.err, (ub4)p, (dvoid*)&ocidate, (sb4)sizeof(ocidate), SQLT_ODT, 0, 0, 0, 0, 0, OCI_DEFAULT);
(dbuf
已定义)。这正是我所期望的。但是当它到达 Oracle 时,它是胡言乱语,导致一个无意义的日期(例如65-JULY-7896 52:69:0
ORA-1858 或 ORA-1801)。有没有人见过这样的事情?谢谢!