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

Единственное, что я мог себе представить в Moment бы изменить свой столбцам Введите из 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 Column держать впоследствии)

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, потому что mysql уже испортил NEW.myDate -Column.

+1

Почему рекомендуется хранить даты в качестве varchar? что просто открывает огромную банку no-no. order by wont work without parsing на каждой «дате» только вокруг очень плохой идеи –

+0

@JohnRuddell Я не рекомендую, я излагаю вариант. И упорядочение на «DateTimeStrings, например 2015-05-02 18:16:25» будет работать на родном пути, а также сравнения типа «><». И если это просто - прочитайте вторую часть - однократный импорт, нет проблемы при этом. после этого он получит столбцы datetime. – dognose

+0

с вашим триггером вам не нужно менять тип. если его форматирование будет «2015-05-02 18: 16: 25», то тип не нужно менять. если его нет в этом формате, тогда порядок и сравнения не будут работать. –

2

Вы можете использовать STR_TO_DATE() в MySQL:

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

Это действительно то, что я хочу, но Я не могу его использовать. Большое вам спасибо, это моя вина, я уточню, что в моем вопросе. –

Смежные вопросы