#sql #delphi
#sql #delphi
Вопрос:
У меня есть несколько поврежденных дат в базе данных Advantage, но, к счастью, у меня есть поле обратной даты, которое не повреждено.
Мне нужно использовать SQL для воссоздания поля даты в форме ‘ДД / ММ / ГГГГ’ из строки RDate ‘ГГГГММДД’.
Что-то эквивалентное:
UPDATE table SET Date = FormatDate('DD/MM/YY',StrToDate('YYYYMMDD',RDate))
Я не знаю, возможно ли таким образом выбирать позиции символов и использовать переменные в SQL или мне придется написать программу (на Delphi) для выполнения операции.
Спасибо
Комментарии:
1. Вы никогда не должны хранить свои даты в виде строк, это просто вызовет проблемы с локализацией позже.
2. С Oracle / MS SQL Server что-то в этом роде возможно с SQL… Я не знаю Advantage DB, чтобы ответить на вопрос… просто хотел сказать: сделайте резервную копию этой таблицы, прежде чем пытаться выполнить такую большую коррекцию / изменение данных
3. Если это всего лишь одноразовая работа, не утруждайте себя поиском необычного синтаксиса SQL. Просто перейдите к таблице из программы Delphi и обновите все, что нуждается в обновлении.
4. @Seph Дата истечения срока действия — это Date(4), но RExpiryDate — это символ (8). Что вы подразумеваете под проблемами локализации? У моих приложений Delphi, как правило, нет проблем с преобразованием между ними. Хотя у нас есть странное необъяснимое повреждение RExpiryDate, я предположил, что запись использовалась во время скачка напряжения или отключения.
Ответ №1:
Попробуйте что-то вроде
update table set
date = cast(substring(rdate, 5, 2) '/'
right(rdate, 2) '/'
left(rdate, 4) as date)
/* where ... */
(при условии, что формат даты вашего соединения установлен по умолчанию 'MM/DD/YYYY'
)
Комментарии:
1. 1 Подход с подстрокой будет работать. Мне неясно, сохраняет ли он как строку или дату. Похоже, проблема с именем столбца «дата».
2. Имена полей на самом деле называются «Дата истечения срока действия» и RExpiryDate, но этот подход к подстроке выдает ошибку 7200 при приведении: Неожиданный токен: ( : найдены дополнительные токены после ожидаемого окончания инструкции — Местоположение ошибки: 39
3. Это выглядит как синтаксическая ошибка. Может быть моя ошибка или ваша опечатка… Проверьте руководства .
Ответ №2:
TOndrej Я не уверен, была ли это синтаксическая ошибка или приведение не распознано, но я достиг желаемого результата со следующим SQL:
update members set "Expiry Date" = ((substring(RExpiryDate,7,2)) '/' (substring(RExpiryDate,5,2)) '/' (substring(RExpiryDate,1,4)))
Спасибо за вашу помощь
Комментарии:
1. Значит, приведение не требуется? Похоже, что Advantage выполняет неявное приведение. Добро пожаловать, я рад, что смог помочь.
2. Если это работает, то «Дата истечения срока действия» сохраняется в виде строки, поэтому приведение к дате не сработало.
3. @ChrisThornton Ты прав, Крис, я тестировал это в другом поле, которое было строкой. На самом деле это не преобразует ее в дату. Я все еще не уверен, как это сделать…