Конференция "Базы" » ADO+dbf - как будут называться функции в select [D7, dBase, FoxPro]
 
  • Раиса © (07.05.09 04:36) [0]
    lower=lcase
    upper=ucase

    А как будут выглядеть типа substring, cast, replace и прочие, если они имеются?
  • Виталий Панасенко (07.05.09 09:13) [1]
    Будет зависеть от провайдера(или драйвера для ODBC провайдера)
  • Раиса © (07.05.09 13:03) [2]
    Provider=MSDASQL;Persist Security Info=False;Data Source=Файлы dBASE;Initial Catalog=путь к файлам
    Настройки ODBC по умолчанию, ничего в них не меняла.
  • Виталий Панасенко (07.05.09 13:54) [3]
    Тогда смотрите доку по dBase... Например, определение позиции подстроки в строке будет AT(Substr, Str), вырезать подстроку Substr(str, Позиция[, Кол-во символов]) и т.д.(ltrim, rtrim, atrim)
  • Раиса © (07.05.09 14:02) [4]
    Попробовала Substr(str, Позиция[, Кол-во символов]) - запрос говорит, что неопределенная функция в строке.
    Про str я знаю, проходит. А вот cast как будет выглядеть (из символов в дату, например)?
    BDE+dbase - функции это одно.
    А где смотреть ODBC +dbase?
  • Anatoly Podgoretsky © (07.05.09 14:10) [5]
    > Раиса  (07.05.2009 14:02:04)  [4]

    Это все потому, что то цепочка длинная {ODBC/JET/BDE(родное)}, с потерей части ДНК
  • sniknik © (07.05.09 14:11) [6]
    > А где смотреть ODBC +dbase?
    есть очень большая вероятность, что в jet (access). зависит от версии. для однозначности надо бы сменить провайдера.
  • Раиса © (07.05.09 14:14) [7]
    Но все-таки хочется написать в запросе: cast, substring, replace, разница между датами в днях...
    А если полностью задача, то: определить список лиц, дни рождения которых приходятся в период с ... по ... и ADO+dbf...
  • Раиса © (07.05.09 14:16) [8]
    А как сменить провайдера на чужом компе? И кто это позволит?
  • sniknik © (07.05.09 14:22) [9]
    > Но все-таки хочется написать в запросе: ...
    хочется так напиши. а вот когда возникнет желание чтобы еще и работало...

    > определить список лиц, дни рождения которых приходятся в период с ... по ... и ADO+dbf...
    чтобы выбрать период нет никакой необходимости в указанных функциях, вообще в запросе не нужно ничего считать, просто определить 2 параметра и задавать их значения перед открытием.

    > А как сменить провайдера на чужом компе? И кто это позволит?
    не на компе и не инетовского... а используемого в твоей программе. для коннекта. почитай про ADO где нибудь...
  • Раиса © (07.05.09 14:27) [10]
    Все же я не представляю, как будет выглядеть запрос (чтобы и работал) о днях рождениях, если в файле дата рождения в виде даты с годом, а надо выбрать всех, у кого дни рождения в период с 29.12 по 05.01, например....
    Помогите, пожалуйста...
  • Anatoly Podgoretsky © (07.05.09 14:45) [11]
    > Раиса  (07.05.2009 14:27:10)  [10]

    Вообще то не представляю такой запрос, BETWEEN не проходит, и очень хорошо что ты привела именно такой формат, очень наглядно. Для MS SQL и других серверов, которые работают с Юлианской датой еще представляю, но с некоторой ошибкой на стыке лет.
  • Игорь Шевченко © (07.05.09 14:52) [12]

    > а надо выбрать всех, у кого дни рождения в период с 29.12
    > по 05.01, например....


    Filtered + OnFilterRecord ?
  • sniknik © (07.05.09 14:58) [13]
    > у кого дни рождения в период с 29.12 по 05.01
    это уже не период, а куча периодов по одному на год

    примерно так (только без гарантий на на все провайдеры кроме jet)
    SELECT * FROM Table1
    WHERE DateSerial(1000, Month(Date), Day(Date)) BETWEEN :Start AND :End

    и задавать нужно в пределах года, если так как у тебя начало в одном конец в другом то нужно либо 2 условия либо 2 запроса. понятно почему думаю. (кстати 1000 это високосный год? вроде да, но если нет то нужно взять високосный)
  • Раиса © (07.05.09 15:02) [14]
    Извините, я еду к врачу, поэтому вернусь часа через 4...

    Игорь Шевченко ©   (07.05.09 14:52) [12]
    А поподробнее... Что в фильтре? И хотелось бы запросом...
  • Anatoly Podgoretsky © (07.05.09 15:30) [15]
    > Раиса  (07.05.2009 15:02:14)  [14]

    Одним запросом не получится и нужен анализ на клиентской стороне и создание динамического запроса.

    if End >= Start then  один еlse первый запрос объединение второй запрос
    Первый запрос до 31.12.2004 и второй запрос начиная c 1.01.2004, при переформатирование дат с заменой года на константу, например 2004, SQL диалект должен позволять разделять дату на составляющие и обратное складывание, хотя бы в текстовый формат YYYYMMDD

    Это при условии, что делается только запросами без применения серверных решений.
  • Anatoly Podgoretsky © (07.05.09 15:32) [16]
    > Раиса  (07.05.2009 15:02:14)  [14]

    Фильтр видимо не пойдет, а вот OnFilterRecord вполне, с учетом выше сказано про переход через год
  • Игорь Шевченко © (07.05.09 15:46) [17]

    > с учетом выше сказано про переход через год


    можно и без перехода, отсеять в фильтре тех, у кого дата рождения с 02.05 до 28.12 - в остатке получатся нужные персоны.
  • Anatoly Podgoretsky © (07.05.09 16:24) [18]
    А надо в промежутках от 28.21 по 31.12 и от 01.01 по конец.

    Вот поэтому и два запроса и объединение (частный случай один запрос).
    Ну или тоже самое в OnFilterRecord, но уже по всему массиву данных.

    Я задачу решал через JulianDay в это Дельфи DayOfYear, не путать с JulianDate, хотя и через нее можно решать, но у меня в СУБД не было поддержки, только JulianDay - оно чем удобно, что не надо самому преобразовывать в количество дней с 1 января любого года. Расчет очень простой. Мне как раз нужен был интервал в 16 дней. Нужен только анализ на один или два запроса.
  • Игорь Шевченко © (07.05.09 16:31) [19]
    Anatoly Podgoretsky ©   (07.05.09 16:24) [18]

    Я подобную задачу решал, но у меня было условие, чтобы начальная дата не превышала конечную (месяц+день), одним запросом, но на оракле - он умеет с датами вытворять кучу преобразований.
  • Anatoly Podgoretsky © (07.05.09 16:44) [20]
    Это тяжелое ограничение, выпадает конец года на интервал расчета. Но вообще то это терпимо.

    Я думаю, что и Оракле есть вариант получения DayOfYear, а с ним обычные скалярные вычисления.
  • sniknik © (07.05.09 16:58) [21]
    > Это тяжелое ограничение, выпадает конец года на интервал расчета.
    да ничего тяжелого, просто это второй вариант, чего jet (ветвлений из запросов) не позволяет.

    вот вариант второго условия для того когда  начало позже чем конец...
    переделка из [13]
    SELECT * FROM Table1
    WHERE DateSerial(1000, Month(Date), Day(Date)) NOT BETWEEN :End AND :Start
    и все.

    конечно можно было бы и 2 условия сделать с "переключателем" какому отрабатывать, но тогда кучу параметров придется вводить (повторять 3 раза по 2 т.е. 6) будет неуклюже, но если только как пример
    SELECT * FROM Table1
    WHERE iif(:Start < :End,
     DateSerial(1000, Month(Date), Day(Date)) BETWEEN :Start AND :End,
     DateSerial(1000, Month(Date), Day(Date)) NOT BETWEEN :End AND :Start)
    если бы можно было в jet как и в mssql делать пакет команд, объявлять переменные, чтобы можно было в одном месте инициализировать было бы другое дело,  но чего нет того нет. лучше на клиенте условие проверить и выполнить нужный из запросов.
  • Раиса © (07.05.09 20:08) [22]
    sniknik ©   (07.05.09 16:58) [21]
    Спасибо огромное. А функция преобразования дат (типа cast as Date) всё же нужна (здесь она DateSerial называется). Спасибо еще за сам запрос - это то, что нужно.

    Интересно, какие еще функции есть?
  • sniknik © (07.05.09 20:47) [23]
    > Интересно, какие еще функции есть?
    я уже говорил где в справку смотреть, первым же постом. и раз уж у тебя прошло что то из нее ...
  • Раиса © (07.05.09 22:57) [24]
    sniknik ©   (07.05.09 20:47) [23]
    А всё же можно поподробнее - где и как искать справку по списку функций?
  • sniknik © (07.05.09 23:43) [25]
    подробнее,  что? как нажимать кнопку F1? а где, я по моему там же в первом посте и указал.
  • Раиса © (08.05.09 01:39) [26]
    Всё равно не поняла, где нажимать F1 (не в Access-е же, которого у меня, предположим,  нет на компе) ...
  • sniknik © (08.05.09 09:10) [27]
    > не в Access-е же
    почему же не в нем если в 1ом посте указан именно он?

    > которого у меня, предположим,  нет на компе
    значит на судьба.

    впрочем можно скопировать оттуда где есть только файлы хелпа, найти нужный и пользоваться "запуская" его. но это уже твои проблемы.
  • Anatoly Podgoretsky © (08.05.09 10:17) [28]

    > WHERE iif(:Start < :End,
    >  DateSerial(1000, Month(Date), Day(Date)) BETWEEN :Start
    > AND :End,
    >  DateSerial(1000, Month(Date), Day(Date)) NOT BETWEEN :End
    > AND :Start)


    Но это неправильное условие, надо просто два запроса

    запрос 1 условие 1
    union
    запрос 2 условие 2
  • sniknik © (08.05.09 10:34) [29]
    > Но это неправильное условие, надо просто два запроса
    почему это неправильное, оно выбирает то что нужно.
    то же самое что выберут 2 запроса с условиями "от и до нового года" и "от нового года и до".
    а если не видно разницы зачем писать больше?
  • sniknik © (08.05.09 10:41) [30]
    чтоб понятнее с раскрытыми переменными
    WHERE DateSerial(1000, Month(Date), Day(Date)) NOT BETWEEN '1000-01-05' AND '1000-12-29'
    выбираем все что не входит в период с конца по начало, а т.к. год у нас "усреднен" остается как раз нужное.
  • Anatoly Podgoretsky © (08.05.09 11:35) [31]
    > sniknik  (08.05.2009 10:41:30)  [30]

    Выберет все с 5 января по 29 декабря, а надо с 29 декабря по 31 декабря и с 1 января по 5 января
  • sniknik © (08.05.09 12:29) [32]
    > Выберет все с 5 января по 29 декабря, а надо с 29 декабря по 31 декабря и с 1 января по 5 января
    WHERE DateSerial(1000, Month(Date), Day(Date)) NOT BETWEEN '1000-01-05' AND '1000-12-29'

    выберет именно с 29декабра по 5января. (ну может из-за неопределенности включения в результат границ условий и будут траблы, но суть от этого не страдает, а BETWEEN можно заменить на явные > <, >= <=, что я обычно и делаю)
  • Anatoly Podgoretsky © (08.05.09 12:32) [33]
    На NOT то я и необратил внимания.
  • Анна (08.05.09 13:13) [34]
    Подскажите пож=та еще по этой теме:
    функции типа replace,substring,charindex необходимые для написания запросов к dbf файлам (через ADO) как называются? Я тоже, в свое время, не смогла найти.
  • Раиса © (08.05.09 13:21) [35]
    В справке по Access я нашла left, right и еще много всего, но аналогов replace, substring, charindex  не вижу. Наверное, они как-то совсем по-другому называются. Интересная функция PARTITION ...
 
Конференция "Базы" » ADO+dbf - как будут называться функции в select [D7, dBase, FoxPro]
Есть новые Нет новых   [134473   +33][b:0][p:0.001]