Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизACCESS SQL UPDATE в зависимости от даты Найти похожие ветки
← →
pr20122012 (2012-05-03 20:29) [0]Здравсвуйте!
Вот такой вопрос: есть БДAccess и я к ней обращаюсь через SQL. Все столбцы в таблице у меня имеют тип данных String. (возможно, это важно???) Мне необходимо обновить данные в одном из столбцов в зависимости от даты в другом. Я пишу SQL запрос:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("Update Mytable set C= "+Chr(39)
+"Поздно"+Chr(39)+" Where D<25/04/2012");
ADOQuery1.ExecSQL;
Не работает! Т.е. значение в столбце C не обновляет! Перерыл инет – так и не понял, как же его сравнить чтоб корректно работало все????
← →
Медвежонок Пятачок © (2012-05-03 20:33) [1]Не обновляет - не значит что не работает.
Здесь скорее наоборот - если бы обновлял - был бы повод сказать что не работает.
← →
Медвежонок Пятачок © (2012-05-03 20:38) [2]кстати, сколько будет 25 разделить на 4, а затем еще на 2012?
← →
Inovet © (2012-05-03 21:02) [3]Используй параметры.
← →
Anatoly Podgoretsky © (2012-05-04 07:05) [4]> pr20122012 (03.05.2012 20:29:00) [0]
> Все столбцы в таблице у меня имеют тип данных String.
Нет у тебя поля даты
А сам запрос тоже безграмотный
← →
pr20122012 (2012-05-04 11:30) [5]Переписал через параметр вот так:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("Update Orders set C= "+Chr(39)
+"22222"+Chr(39)+" Where D<:Data1");
ADOQuery1.Parameters.ParamValues["Data1"]:=Now;
ADOQuery1.ExecSQL;
Все равно не работает!
:((((
← →
pr20122012 (2012-05-04 11:36) [6]Да, если я меняю тип столбца на дата/время в Access то вроде как все работает! Но у меня тип - текстовый.... Можно ли в рамках запроса преобразовывать значения из В в дату????
← →
Anatoly Podgoretsky © (2012-05-04 12:02) [7]> pr20122012 (04.05.2012 11:30:05) [5]
А у тебя в базе есть записи с датами, которые еще не наступили, и с
точностью до миллисекунды как минимум
← →
Anatoly Podgoretsky © (2012-05-04 12:03) [8]> pr20122012 (04.05.2012 11:36:06) [6]
Раз тип текстовый тогда не приходится говорить об датах и использовать их
как дату
← →
Медвежонок Пятачок © (2012-05-04 12:29) [9]Все равно не работает!
да неужели?
select * from orders where d < :dte
тоже "не работает"? ничего не возвращает?
а может все таки работает и то и другое?
просто апдейтить и возвращать нечего?
← →
pr20122012 (2012-05-04 14:22) [10]Спасибо всем за ответы!
Вот в таком варианте оно работает:
...
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("Update Orders set C= "+Chr(39)
+"22222"+Chr(39)+" Where Cdate(D)< Cdate(:Data1)");
ADOQuery1.Parameters.ParamValues["data1"]:=DateToSQLStr;
ADOQuery1.ExecSQL;
...
function DateToSQLStr: String ;
var
d, m, y : word ;
begin
DecodeDate(Now-1, y, m, d) ;
Result := IntToStr(d)+"/"+IntToStr(m)+"/"+IntToStr(y) ;
end;
Но при этом возникла новая проблема! Если какое-либо значение отсутствие (NULL или "") то Cdate() не выполняется и возвращает ошибку.
Вопрос: есть ли конструкция IF или что-то подобное, чтобы иметь дело только с датами без пустот
← →
Медвежонок Пятачок © (2012-05-04 14:36) [11]таких проблем еще будет милльон.
они - постоянные спутники тех, кто изначально неправильно спроектировал структуру данных.
ты - один из них.
where <условие на дату>
and <поле не нулл>
and <поле не пустая строка>
но это все равно не спасет от неизбежных ошибок конвертации строки в дату (в поле таблицы)
← →
pr20122012 (2012-05-04 14:38) [12]Пытаюсь вот такое но не работает
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("Update Orders set C= "+Chr(39)
+"22222"+Chr(39)+" Where IsNull(Cdate([D]),0)< Cdate(:Data1)");
ADOQuery1.Parameters.ParamValues["data1"]:=DateToSQLStr;
ADOQuery1.ExecSQL;
← →
Медвежонок Пятачок © (2012-05-04 14:42) [13]не работает - значит у него выходной.
зы а почему в параметре строка, а в изнулле по дефолту число?
← →
MsGuns © (2012-05-04 14:45) [14]Вашу "задачку" можно режить "чистым" SQL преобразуя (CAST/CONVERT - читаем внимательно Jetsql40.chm) в числа дату-образец и строковую дату-поле и сравнивая уже их (числа).
Но в целом будет задница ибо [11]
← →
pr20122012 (2012-05-04 14:51) [15]Медвежонок Пятачок
Ну это я так :))))
правда про другому тоже ничего не меняется
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("Update Orders set C= "+Chr(39)
+"11"+Chr(39)+" Where IsNull(Cdate([d]),"+Chr(39)+"0"+Chr(39)+")< Cdate(:Data1)");
ADOQuery1.Parameters.ParamValues["data1"]:=DateToSQLStr;
ADOQuery1.ExecSQL;
← →
MsGuns © (2012-05-04 14:52) [16]Проблему "пустышек" решать с использованием where и, если нужно, UNION с запросом выборки "пустышек" и замены их на некоторую фикс.дату:
SELECT F1,F2,F3,MAYINVALIDDATE,F4
where MAYINVALIDDATE is not null and MAYINVALIDDATE<>""
UNION
SELECT F1,F2,F3,"31/12/2012" as MAYINVALIDDATE,F4
where MAYINVALIDDATE is null or MAYINVALIDDATE=""
Результирующий запрос:
SELECT A.* from
(SELECT F1,F2,F3,MAYINVALIDDATE,F4
where MAYINVALIDDATE is not null and MAYINVALIDDATE<>""
UNION
SELECT F1,F2,F3,"31/12/2012" as MAYINVALIDDATE,F4
where MAYINVALIDDATE is null or MAYINVALIDDATE="") A
WHERE <вот тут выражение сравнения дат>
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.122 c