![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в ADO SQL-запросе указать дату? [dBase, FoxPro, ADO]
kaif © (2006-09-25 14:52:00)Никак не могу сделать условие по дате:
Ни один вариант не работает. Говорит operator/operdand type mismatch:
select * from mytable where adate = '11.09.2006'
select * from mytable where adate = '11/09/2006'
select * from mytable where adate = 11.09.2006
select * from mytable where adate = 11/09/2006
База данных FoxPro. OLE DB Provider.
Как явно записать дату в SQL-запросе?
sniknik (2006-09-25 18:42:00) [1]ну если считать каждое незнание формата/чегото в определенной базе, проблемой базы... то их, этих проблем стока... что лучше и не начинать... (лучше следовать девизу "сделай свой двор чище!" ;о)))
> в которых не ясно, что вообще записано...
1C? :) они это любят, записать так чтобы было неясно, а через саму 1С все понятно.
kaif (2006-09-25 18:31:00) [2]2 Desdechado © (25.09.06 17:44) [17]
Неудобно было потому что я занимался исследованием таблицы. Делал сотни разныхзапросов, локализуя сбойные строки. Мне нужно было то отсеивать по дате, то еще как-то, то группировать по каким-то полям и искать корреляции. У меня там 60 полей, в которых не ясно, что вообще записано...
Я в первый раз лезу в базу, в которой столько проблем.
Desdechado (2006-09-25 17:44:00) [3]а почему параметры использовать неудобно?!
имхо, совсем наоборот
Ашот, ты прям как первый раз в БД лезешь...
sniknik (2006-09-25 16:31:00) [4]> И видно первая из них и вызывает сбой. Как чинить таблицу - в толк не возьму.
посмотри текстовым редактором файл, интересующие записи, старый фокс/BDE/хз. что еще позволяло заносить в числовые поля строки, в смысле они там и так строки я не про то, а то что если записать им число с переполнением например 100000 в поле desimal(3) то он (этот ктото из списка) не давал ошибку а писал в поля "***" вот как есть строкой... естественно число из него уже не прочитаеш, даже если очень хочется...
были у меня такие таблици.
Ega23 (2006-09-25 15:55:00) [5]
> В БД фокспро в полях типа date нет миллисекунд, а также
> часов, минут и секунд...
>
Этот формат для MSSQL. Для других СУБД использовать не пробовал.
kaif (2006-09-25 15:54:00) [6]Да, действительно на эту дату существуют еще записи (еще десяток). И видно первая из них и вызывает сбой. Как чинить таблицу - в толк не возьму. Делаю копию в FoxPro (save as...). Без индексов. Упаковываю даже на всякий пожарный. Все равно - сбой. Глюкавый какой-то этот FoxPro OLE DB Provider...
:(
kaif (2006-09-25 15:39:00) [7]Офигеть! Явно набрал как в FoxPro:
select * from ... where data = {09.11.2006}
И сработало!!!!
Спасибо всем, особенно SergP © и Ega23!
Мне такое и в голову бы не пришло...
kaif (2006-09-25 15:36:00) [8]собственно, зачем я этим занят...
У меня здесь такая засада с этим драйвером...
Одна важная таблица нормально не открывается.
Говорит "поставщик данных вернул состояние E_FAIL".
Причем результитрующий набор в сетке виден, но перемещаться по нему невозможно - любая попытка сдвинуться с места порождает эту же ошибку E_FAIL.
Полей в этой таблице штук 60.
Если три поля исключаю из запроса, все нормально открывается.
Исследовал строки, в которых происходит сбой.
Сужал набор при помощи дат (для этого они мне и понадобились).
Добился того, что вне трех дат (26.11.2003, 03.12.2003, 26.02.2004) сбоя не наблюдаю.
Сужаю набор до одной даты: 26.02.2004.
Сбой виден.
В наборе 12 строк.
Там еще поле time (у авторов таблицы там текст, означающий, видно, минуты от полуночи в текстовом виде по 4 цифры).
Методом исключения добился, что запрос вида
select * from ... where data = :data and time < '1123'
возвращает 12 строк без сбоя,
а запрос
select * from ... where data = :data and time <> '1123'
возвращает те же 12 строк со сбоем.
Видно есть еще 13-я строка, которая и вызывает сбой.
Мне нужно делать импорт этих данных.
Сейчас в FoxPro Поищу эту тринадцатую строку.
Интересно, число 13 действительно заколдованное?...:)
SergP (2006-09-25 15:32:00) [9]> Если ещё и миллисекунды нужны - .zzz добавь.
В БД фокспро в полях типа date нет миллисекунд, а также часов, минут и секунд...
Ega23 (2006-09-25 15:22:00) [10]
const SQLDateTimeFmt='"{ts''" yyyy-mm-dd hh:nn:ss"'' }"';
Если ещё и миллисекунды нужны - .zzz добавь.
Обращаться - SysUtils.DateTimeToString( ... ,SQLDateTimeFmt, ....);
SergP (2006-09-25 15:16:00) [11]> Если кто знает функцию какую-нибудь типа encode() для SQL-
> синтаксиса ADO, буду признателен за помощь.
> Пока поработаю передачей через параметр.
если используешь фокспровский провайдер, то попробуй ф-цию ctod()
В фоксе есть такая штука, а вот будет ли работать через АДО - не знаю...
stud (2006-09-25 15:12:00) [12]дык через параметры отлично работает.
может там время все портит?
SergP (2006-09-25 15:10:00) [13]В самом фокспро дата указывается так:
where date = {01.01.2006}
т.е. в фигурных скобках. Правда внутри формат даты может быть разным.
попробуй... Может через адо аналогично будет...
kaif (2006-09-25 15:10:00) [14]Никак не выходит.
Через параметр достучался.
qryQuery.Parameters.ParamByName('data').Value := StrToDate('11.09.2006');
Это очень неудобно, ну да ладно. Как-нибудь перебьюсь.
Спасибо.
Если кто знает функцию какую-нибудь типа encode() для SQL-синтаксиса ADO, буду признателен за помощь.
Пока поработаю передачей через параметр.
clickmaker (2006-09-25 15:06:00) [15]в FoxPro вроде бы формат по умолчанию mm/dd/yyyy
попробуй так
set date german
select * from mytable where adate = '11.09.2006'
kaif (2006-09-25 15:03:00) [16]clickmaker © (25.09.06 14:57) [2]
еще так не пробовал
'2006-09-11'
Все пробовал. Сейчас через параметры попробую. Хотя мне это крайне неудобно.
Может функция есть какая по кодированию даты в ADO?
Я с ADO редко работаю. Не знаю.
kaif (2006-09-25 15:01:00) [17]select * from mytable where adate = cast('11/09/2006' as date)
select * from mytable where adate = cast('09/11/2006' as date)
не дает ошибки.
Но и набор возвращает пустой, хотя такие даты есть.
Я уже на стену лезу. В google поиск пока ничего не прояснил.
Sergey13 (2006-09-25 14:57:00) [18]Через параметры наверное.
clickmaker (2006-09-25 14:57:00) [19]еще так не пробовал
'2006-09-11'
а может лучше так?
select * from mytable where adate = :ADate;
Query.ParamByname('ADate').AsDateTime := Now;