有没有办法更改默认日期输入格式

时间:2015-10-17 20:39:09

标签: mysql date-format

我有一个数据来源,我从中提取一些字段,字段中有一些 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 */
}

所以问题是:

  • 如何告诉MySQL服务器日期字段的格式是什么?

澄清Comment 1

不一定是INSERT,它比这更复杂。它们有时会查询其中的所有参数,有时它们只是参数,我必须构建查询。这是一个巨大的混乱,但我无法做任何事情,因为它是一个付费数据库,我必须暂时使用它。

真正的问题是当查询来自源并且必须按原样发送时,因为那时可能会发生很多次事件。当我逐个拆分参数时,没有真正的问题,因为解析上述日期格式并生成适当的MySQL值非常简单。

2 个答案:

答案 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。