有人可以告诉我如何从用C编写的udf返回firebird TIMESTAMP类型吗?
更具体地说,是否有相应的C类型映射到Firebird中的TIMESTAMP类型?如果是,哪个标题包含其定义?谢谢!
答案 0 :(得分:1)
您需要使用ISC_TIMESTAMP
中定义的ibase.h
。您应该可以使用isc_encode_timestamp
转换tm
time.h
,但由于我不是自己使用C或C ++编程,因此我没有更多内容详细信息或准备好的例子。
答案 1 :(得分:0)
使用Mark的建议,这是一个实现:
#include <time.h>
#include <ibase.h>
#include <ib_util.h>
typedef long long int SINT64;
ISC_TIME encode_time(int hours, int minutes, int seconds, int fractions)
{
return ((hours * 60 + minutes) * 60 + seconds) * ISC_TIME_SECONDS_PRECISION + fractions;
}
ISC_DATE encodeDate(const struct tm* t){
// Convert a calendar date to a numeric day
// (the number of days since the base date)
const int day = t->tm_mday;
int month = t->tm_mon + 1;
int year = t->tm_year + 1900;
if (month > 2)
month -= 3;
else
{
month += 9;
year -= 1;
}
const int c = year / 100;
const int ya = year - 100 * c;
return (ISC_DATE) (((SINT64) 146097 * c) / 4 +
(1461 * ya) / 4 +
(153 * month + 2) / 5 + day + 1721119 - 2400001);
}
ISC_TIMESTAMP* UTCServerTime(){
time_t t = time(NULL);
struct tm utc;
gmtime_r(&t, &utc);
ISC_TIMESTAMP* ib_utc = (ISC_TIMESTAMP*)
ib_util_malloc(sizeof(ISC_TIMESTAMP));
ib_utc->timestamp_date = encodeDate(&utc);
ib_utc->timestamp_time = encode_time(utc.tm_hour,utc.tm_min,utc.tm_sec, 0);
return ib_utc;
}