Не силен я в SQL поэтому откладывал как мог, но сегодня пришлось заняться. И у меня появились вопросы.
Почему не работает вот такой скрипт.
aQuery := 'UPDATE `program_table` ' +
'SET `TRM1_ProgramDuration` = `2017.02.03 16:48:36`, ' +
'`TRM2_ProgramDuration` = NOW() WHERE `ID` = 1;';
В MySQL WorkBench работает такая последовательность.
update TENQ.program_table SET TRM1_ProgramDuration = '2017.02.03 17:48:36', TRM2_ProgramDuration = Now() where ID = 1;
Дело тут в формате даты/времени, потому что если я меняю `2017.02.03 16:48:36` на NOW(), то и из SS2 скрипт записывает в таблицу. Но сколько я не танцевал с бубном с различными форматами и преобразованиями, так у меня ничего и не получилось.
И еще вопрос. Это шаманство с апострофами/одинарными кавычками для названий таблиц, столбцов можно убрать? И так новичку непонятно ничего, так еще и разберись где их ставить, а где нет. В идеале я хотел бы через ctl+c/v скопировать из WorkBench рабочую последовательность и вставить ее в скрипт SS2 и чтобы заработало).
Все, разобрался.Вот так работает.
aTRM1_ProgramDuration := QuotedStr('2017.02.03 16:48:36');
aQuery := 'UPDATE `program_table` ' +
'SET `TRM1_ProgramDuration` = ' + aTRM1_ProgramDuration + ', ' +
'`TRM2_ProgramDuration` = NOW() WHERE `ID` = 1;';
Т.е. таки оказалось, что вся проблема в этих кавычках/апострофах. Причем только обходным путем, используя дополнительную функцию ее удалось решить. Но это же и не очевидно и не удобно.
Я сейчас столкнулся с вещью, которая мне убила мне час времени. Я никак не мог понять, почему у меня не работает последовательность
aTRM1_ProgramDuration := QuotedStr(DateTimeToStr(vrTRM1_ProgramDuration.AsDateTime));
aTRM2_ProgramDuration := QuotedStr(DateTimeToStr(vrTRM2_ProgramDuration.AsDateTime));
aQuery := 'UPDATE `program_table` ' +
'SET `TRM1_ProgramDuration` = ' + aTRM1_ProgramDuration + ', ' +
'`TRM2_ProgramDuration` = ' + aTRM2_ProgramDuration + ' WHERE `ID` = 1;';
Ведь все же работает, если я дату беру из текста. Но из переменной ни в какую. А дело было вот в чем. Я инициализировал переменные vrTRM1_ProgramDuration через функцию StrToTime. При этом переменной присваивается год 1899. А MySQL считает что в дате ошибка, если год ниже 1970 (проверено экспериментально).