2015-10-17 73 views
0

我有数据从哪里提取一些领域的来源,该领域中有一些日期场和源将他们的价值观这样有没有办法来改变默认的日期输入格式

#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值非常简单。

+0

_“并将其发送到MySQL服务器”_ - 这意味着什么,到底是什么?你是否创建了简单的INSERT语句发送到数据库?如果您可以更改这些内容,则可以使用['STR_TO_DATE'](http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_str-to-date)“已经在查询中解析该格式。否则,您可能希望使用简单的文本字段将数据插入到第一个字段中,然后运行UPDATE查询,然后使用上述函数将该值传输到实际日期列。 – CBroe

+0

@CBroe我补充说明一下。 –

+0

你不能这样做。除非你的列是一个varchar(你不想这样做)在发送到你的服务器之前格式化日期以成为正确的日期格式。 [heres一个有用的链接](http://stackoverflow.com/questions/3350465/how-to-change-default-date-format-when-creating-table-in-mysql) –

回答

1

我能想象在目前的唯一的事情是改变你的列 - 从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 ; 

如果你只是需要有关运行导入一次,使用触发器来产生一个“正确”的dateTimeColumn出刀片的 - 事后删除VARCHAR列:

( '指明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 ; 

可惜你不能用一个三角ger在datetime-column本身上工作,因为mysql已经搞乱了Column-NEW.myDateColumn。

+1

为什么建议将日期存储为varchar?这只是打开一个巨大的不可否认的罐头。顺序通过不会工作,没有解析每个“日期”只是围绕一个非常糟糕的主意 –

+0

@JohnRuddell我不推荐,我概述了一个选项。并且在“DateTimeStrings,如2015-05-02 18:16:25”上订购将以本地方式工作,以及诸如“><”的比较。如果只是 - 阅读第二部分 - 一次导入,这样做没有问题。之后他会以日期时间结束。 – dognose

+0

与你的触发器,你不需要改变类型。如果将其格式化为“2015-05-02 18:16:25”,那么类型不需要改变。如果它不是这种格式,那么排序和比较将不起作用 –

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#')); 
+0

这真的是我想要的,但我无法使用它。非常感谢,这是我的错,我会在我的问题中澄清。 –