我有一个数据来源,我从中提取一些字段,字段中有一些 date 字段,而源发送它们的值就像这样
#DD/MM/YYYY#
几乎所有字段都可以在没有修改的情况下发送到查询中,当然除此之外。
我编写了一个程序,从互联网连接获取数据并将其发送到MySQL服务器并且它应该发送所有内容,我确定因为我启用了MySQL服务器中的常规日志记录而且我可以看到所有查询都是正确的,除了带有日期字段的查询。
我想避免以这种方式解析字段,因为它全部用c编写了很多工作,但是如果没有办法,我理解并接受它为答案当然。
作为一个例子,假设我们有以下
INSERT INTO sometable VALUES ('#12/10/2015#', ... OTHER_VALUES ..., '#11/10/2015#');
在这种情况下,我使用mysql_query()
中的libmysqlclient
将整个内容作为查询发送。
在其他情况下,我可以将消息的各个部分拆分成类似指令和参数的东西,就像这样
iab A,B,C,#12/10/2015#,X,Y,#11/10/2015#
这可能意味着INSERT INTO table_a_something_b_whatever VALUES
,在这种情况下,我当然会捕获所有参数并发送一个包含VALUES
列表的查询。同样在这种情况下,它相当简单,因为我可以像这样处理日期
char date[] = "#11/10/2015#";
int day;
int month;
int year;
if (sscanf(date, "#%d/%d/%d#", &day, &month, &year) == 3)
{
/* it's fine, build a sane YYYY-MM-DD */
}
所以问题是:
澄清:Comment 1
不一定是INSERT
,它比这更复杂。它们有时会查询其中的所有参数,有时它们只是参数,我必须构建查询。这是一个巨大的混乱,但我无法做任何事情,因为它是一个付费数据库,我必须暂时使用它。
真正的问题是当查询来自源并且必须按原样发送时,因为那时可能会发生很多次事件。当我逐个拆分参数时,没有真正的问题,因为解析上述日期格式并生成适当的MySQL值非常简单。
答案 0 :(得分:2)
您可以在MySQL中使用STR_TO_DATE()
:
SELECT STR_TO_DATE('#08/10/2015#','#%d/%m%Y#');
将此作为INSERT
流程的一部分:
INSERT INTO yourtable (yourdatecolumn) VALUES (STR_TO_DATE('#08/10/2015#','#%d/%m%Y#'));
答案 1 :(得分:1)
我唯一可以想象的事情就是将你的Column-Type从DateTime更改为varchar并使用BEFORE INSERT
触发器来修复“错误”的日期。
这样的事情:
DELIMITER //
CREATE TRIGGER t1 BEFORE INSERT on myTable FOR EACH ROW
BEGIN
IF (NEW.myDate regexp '#[[:digit:]]+\/[[:digit:]]+\/[[:digit:]]+#') THEN
SET NEW.myDate = STR_TO_DATE(NEW.myDate,'#%d/%m/%Y#');
END IF;
END; //
DELIMITER ;
如果您只需要运行一次导入问题,请使用Trigger从插入中生成“正确的”dateTimeColumn - 然后删除varchar-column:
('myDate':=之后要删除的varchar列;''myRealDate':=之后要保留的DateTime列)
DELIMITER //
CREATE TRIGGER t1 BEFORE INSERT on myTable FOR EACH ROW
BEGIN
IF (NEW.myDate regexp '#[[:digit:]]+\/[[:digit:]]+\/[[:digit:]]+#') THEN
SET NEW.myRealDate = STR_TO_DATE(NEW.myDate,'#%d/%m/%Y#');
else
#assume a valid date representation
SET NEW.myRealDate = NEW.myDate;
END IF;
END; //
DELIMITER ;
不幸的是你不能使用Trigger来处理datetime-column本身,因为mysql已经弄乱了NEW.myDate
- Column。