![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ACCESS SQL UPDATE в зависимости от даты
pr20122012 © (2012-05-03 20:29:00)Здравсвуйте!
Вот такой вопрос: есть БД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 не обновляет! Перерыл инет – так и не понял, как же его сравнить чтоб корректно работало все????
MsGuns (2012-05-04 14:52:00) [1]Проблему "пустышек" решать с использованием 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 <вот тут выражение сравнения дат>
pr20122012 (2012-05-04 14:51:00) [2]Медвежонок Пятачок
Ну это я так :))))
правда про другому тоже ничего не меняется
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:45:00) [3]Вашу "задачку" можно режить "чистым" SQL преобразуя (CAST/CONVERT - читаем внимательно Jetsql40.chm) в числа дату-образец и строковую дату-поле и сравнивая уже их (числа).
Но в целом будет задница ибо [11]
Медвежонок Пятачок (2012-05-04 14:42:00) [4]не работает - значит у него выходной.
зы а почему в параметре строка, а в изнулле по дефолту число?
pr20122012 (2012-05-04 14:38:00) [5]Пытаюсь вот такое но не работает
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:36:00) [6]таких проблем еще будет милльон.
они - постоянные спутники тех, кто изначально неправильно спроектировал структуру данных.
ты - один из них.
where <условие на дату>
and <поле не нулл>
and <поле не пустая строка>
но это все равно не спасет от неизбежных ошибок конвертации строки в дату (в поле таблицы)
pr20122012 (2012-05-04 14:22:00) [7]Спасибо всем за ответы!
Вот в таком варианте оно работает:
...
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 12:29:00) [8]Все равно не работает!
да неужели?
select * from orders where d < :dte
тоже "не работает"? ничего не возвращает?
а может все таки работает и то и другое?
просто апдейтить и возвращать нечего?
Anatoly Podgoretsky (2012-05-04 12:03:00) [9]> pr20122012 (04.05.2012 11:36:06) [6]
Раз тип текстовый тогда не приходится говорить об датах и использовать их
как дату
Anatoly Podgoretsky (2012-05-04 12:02:00) [10]> pr20122012 (04.05.2012 11:30:05) [5]
А у тебя в базе есть записи с датами, которые еще не наступили, и с
точностью до миллисекунды как минимум
pr20122012 (2012-05-04 11:36:00) [11]Да, если я меняю тип столбца на дата/время в Access то вроде как все работает! Но у меня тип - текстовый.... Можно ли в рамках запроса преобразовывать значения из В в дату????
pr20122012 (2012-05-04 11:30:00) [12]Переписал через параметр вот так:
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;
Все равно не работает!
:((((
Anatoly Podgoretsky (2012-05-04 07:05:00) [13]> pr20122012 (03.05.2012 20:29:00) [0]
> Все столбцы в таблице у меня имеют тип данных String.
Нет у тебя поля даты
А сам запрос тоже безграмотный
Inovet (2012-05-03 21:02:00) [14]Используй параметры.
Медвежонок Пятачок (2012-05-03 20:38:00) [15]кстати, сколько будет 25 разделить на 4, а затем еще на 2012?
Медвежонок Пятачок (2012-05-03 20:33:00) [16]Не обновляет - не значит что не работает.
Здесь скорее наоборот - если бы обновлял - был бы повод сказать что не работает.