Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

Не обновляет - не значит что не работает.
Здесь скорее наоборот - если бы обновлял - был бы повод сказать что не работает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо