Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.192 c
2-1342449803
solovei
2012-07-16 18:43
2013.03.22
дождаться завершения установки


15-1352217376
Evgely
2012-11-06 19:56
2013.03.22
В окне кода вместо текста стали прямоугольники...


15-1351711327
Дмитрий С
2012-10-31 23:22
2013.03.22
Логи


15-1334261351
К
2012-04-13 00:09
2013.03.22
Поменять курсор


15-1344430720
AV
2012-08-08 16:58
2013.03.22
is not null VS not is null. Мини холи-вар?