gpt4 book ai didi

mysql - 对单独的日期和时间使用相同的缓冲区

转载 作者:行者123 更新时间:2023-11-29 12:23:41 24 4
gpt4 key购买 nike

我正在使用 MySQL C api 以及准备好的语句。当发出带有 TIME 字段的 INSERT 查询时,结果采用 HHH:MM:SS 格式,其中小时数是本月过去的小时数。例如,如果日期是 2015-02-21,时间是 21:30:00,则时间将显示为 525:30:00,但我想使用 HH:MM:SS 格式(例如 21:30 :00),这将是一天中的实际时间。

sbind[3].buffer_type=MYSQL_TYPE_DATE;
sbind[3].buffer= (char *)&ts; // Pointer to a MYSQL_TIME data structure
sbind[3].is_null= 0;
sbind[3].length= 0;

sbind[4] = sbind[3];
sbind[4].buffer_type=MYSQL_TYPE_TIME;

mysql_stmt_bind_param(stmt, sbind); // sbind is an array of MYSQL_BIND structures

ts.year= 1900+tm_info->tm_year; // tm_info is a pointer to a tm structure
ts.month= 1+tm_info->tm_mon;
ts.day= tm_info->tm_mday;

ts.hour= tm_info->tm_hour;
ts.minute= tm_info->tm_min;
ts.second= tm_info->tm_sec;

此代码将日期字段准备为 yyyy-mm-dd 并用 tm_info 中的日期填充。同样,它会对时间字段执行相同的操作,但格式为 HHH:MM:SS。

一种不流行的有效方法是暂时使用单独的 MYSQL_TIME 结构,但我的目标是一种更优雅的方法来处理这个问题。

(编辑:这里我包含了相关的客户端代码

MYSQL_TIME  ts;
MYSQL_STMT *stmt;
MYSQL_BIND sbind[2];

...

char query[QUERY_BUFFER_SIZE];
strcpy(query, "INSERT INTO `mytable` (date,time) VALUES(?,?)");
if(mysql_stmt_prepare(stmt, query, strlen(query))){
return mysql_stmt_errno(stmt);
}

...

time_t rawtime;
time(&rawtime); // get current time
struct tm *tm_info = localtime ( &rawtime );

...

memset(sbind,0,sizeof(sbind));

sbind[0].buffer_type=MYSQL_TYPE_DATE;
sbind[0].buffer= (char *)&ts; // Pointer to a MYSQL_TIME data structure
sbind[0].is_null= 0;
sbind[0].length= 0;

sbind[1] = sbind[0];
sbind[1].buffer_type=MYSQL_TYPE_TIME;

mysql_stmt_bind_param(stmt, sbind); // sbind is an array of MYSQL_BIND structures

ts.year= 1900+tm_info->tm_year; // tm_info is a pointer to a tm structure
ts.month= 1+tm_info->tm_mon;
ts.day= tm_info->tm_mday;

ts.hour= tm_info->tm_hour;
ts.minute= tm_info->tm_min;
ts.second= tm_info->tm_sec;

if(mysql_stmt_execute(stmt)){
return mysql_stmt_errno(stmt);
}

这假设 mysql 是一个有效的连接。本例中的表 mytable 仅包含 DATE 类型和 TIME 类型。

)

最佳答案

这是 TIME type 的自然表示 - 顾名思义,它只保存时间,这是表达大于一天的时间的自然方式。正如文档所建议的,它确实使用 HH:MM:SS 来表示较小的值。

TIME does not care about shenanigans like leap seconds 起,要排除全天,只需采用 tm_hour%24。但是,为了允许像 DST 转换这样的恶作剧,您只需将 TIME 添加到特定月份的起点并使用股票函数执行 DATETIME 算术即可。

@c45602234:

试图智胜libmysql失败(mysql-connector-c-6.1.5/libmysql/libmysql.c:1964):

static void store_param_date(NET *net, MYSQL_BIND *param)
{
MYSQL_TIME tm= *((MYSQL_TIME *) param->buffer);
tm.hour= tm.minute= tm.second= tm.second_part= 0;
net_store_datetime(net, &tm);
}

正如你所看到的,它总是用完整个结构(显然,这样相关的函数总是按预期工作)。

关于mysql - 对单独的日期和时间使用相同的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28651374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com