日期/时间字段
C 语言中管理日期/时间字段
正如日期时间字段页面中所解释的那样,日期时间类型的字段是一个 64 位整数值,用于在数据库中存储日期和时间,而日期时间值的精度由运行时参数 DATETIME_PRECISION
决定,该参数表示每秒的滴答数。DATETIME_PRECISION 的默认值为 1,这意味着数据库将日期时间值存储为自纪元(即 1970 年 1 月 1 日 00:00:00 UTC)以来的秒数。
例如,以下模式片段定义了日期/时间字段以及日期/时间值的序列:
class T
{
date d;
time t;
datetime dt;
sequence<date> sd;
sequence<time> st;
sequence<datetime> sdt;
}
可以通过 mco_runtime_setoption()
API 为选项 MCO_RT_OPTION_DATETIME_PRECISION
更改日期时间字段的分辨率。允许的精度(分辨率)值范围从 1(秒数)到 1000000000(纳秒)。例如,以下代码片段将精度设置为 1000000(1,000,000),以存储自纪元以来的微秒数:
mco_runtime_setoption(MCO_RT_OPTION_DATETIME_PRECISION, 1000000);
两个函数mco_time2ticks()
和mco_ticks2time()
可用于在应用程序和数据库的解析之间转换日期时间。例如,考虑一个应用程序在变量app_time
中存储以毫秒为单位的时间值(即:MCO_RT_OPTION_DATETIME_PRECISION == 1000
)。
下面的代码将在字段 T.dt
中存储EPOCH
之后的毫秒数:
T_dt_put(&obj, mco_ticks2time(app_time, 1000));
同样地,以下示例存储了由 mco_system_get_current_time()
返回的当前时间:
T_dt_put(&obj, mco_ticks2time(mco_system_get_current_time(), 1000*1000))
这里,在调用 mco_ticks2time()
时,第二个参数为 1000*1000,因为 mco_system_get_current_time()
返回的时间单位是微秒。
同样,mco_time2ticks()
用于将从数据库加载的日期时间值转换为所需的分辨率。
例如:
mco_datetime dt;
T_dt_get(&obj, &dt);
printf("dt (in msecs) = %llu, dt (in usecs) = %llu\n",
mco_time2ticks(dt, 1000),
mco_time2ticks(dt, 1000*1000));
映射SQL日期和时间字段
为了将 C 语言中的日期或时间数据映射到 SQL 数据类型,C 应用程序应使用 8 字节的 mco_datetime
数据类型(而不是 mco_time 或 mco_date)。日期和时间类型在 SQL 中通过 8 字节的 tpDatetime 类型来表示。(使用 %l 或 %*l 替换说明符,因为这是一个 8 字节或 int64_t 值。)