2015-10-17 86 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

這真的是我想要的,但我無法使用它。非常感謝,這是我的錯,我會在我的問題中澄清。 –

相關問題