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

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

Как в 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;


Наверх

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