![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO+dbf - как будут называться функции в select [D7, dBase, FoxPro]
Раиса © (2009-05-07 04:36:00)lower=lcase
upper=ucase
А как будут выглядеть типа substring, cast, replace и прочие, если они имеются?
Раиса (2009-05-08 13:21:00) [1]В справке по Access я нашла left, right и еще много всего, но аналогов replace, substring, charindex не вижу. Наверное, они как-то совсем по-другому называются. Интересная функция PARTITION ...
Анна (2009-05-08 13:13:00) [2]Подскажите пож=та еще по этой теме:
функции типа replace,substring,charindex необходимые для написания запросов к dbf файлам (через ADO) как называются? Я тоже, в свое время, не смогла найти.
Anatoly Podgoretsky (2009-05-08 12:32:00) [3]На NOT то я и необратил внимания.
sniknik (2009-05-08 12:29:00) [4]> Выберет все с 5 января по 29 декабря, а надо с 29 декабря по 31 декабря и с 1 января по 5 января
WHERE DateSerial(1000, Month(Date), Day(Date)) NOTBETWEEN '1000-01-05' AND '1000-12-29'
выберет именно с 29декабра по 5января. (ну может из-за неопределенности включения в результат границ условий и будут траблы, но суть от этого не страдает, а BETWEEN можно заменить на явные > <, >= <=, что я обычно и делаю)
Anatoly Podgoretsky (2009-05-08 11:35:00) [5]> sniknik (08.05.2009 10:41:30) [30]
Выберет все с 5 января по 29 декабря, а надо с 29 декабря по 31 декабря и с 1 января по 5 января
sniknik (2009-05-08 10:41:00) [6]чтоб понятнее с раскрытыми переменными
WHERE DateSerial(1000, Month(Date), Day(Date)) NOT BETWEEN '1000-01-05' AND '1000-12-29'
выбираем все что не входит в период с конца по начало, а т.к. год у нас "усреднен" остается как раз нужное.
sniknik (2009-05-08 10:34:00) [7]> Но это неправильное условие, надо просто два запроса
почему это неправильное, оно выбирает то что нужно.
то же самое что выберут 2 запроса с условиями "от и до нового года" и "от нового года и до".
а если не видно разницы зачем писать больше?
Anatoly Podgoretsky (2009-05-08 10:17:00) [8]
> 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 (2009-05-08 09:10:00) [9]> не в Access-е же
почему же не в нем если в 1ом посте указан именно он?
> которого у меня, предположим, нет на компе
значит на судьба.
впрочем можно скопировать оттуда где есть только файлы хелпа, найти нужный и пользоваться "запуская" его. но это уже твои проблемы.
Раиса (2009-05-08 01:39:00) [10]Всё равно не поняла, где нажимать F1 (не в Access-е же, которого у меня, предположим, нет на компе) ...
sniknik (2009-05-07 23:43:00) [11]подробнее, что? как нажимать кнопку F1? а где, я по моему там же в первом посте и указал.
Раиса (2009-05-07 22:57:00) [12]sniknik © (07.05.09 20:47) [23]
А всё же можно поподробнее - где и как искать справку по списку функций?
sniknik (2009-05-07 20:47:00) [13]> Интересно, какие еще функции есть?
я уже говорил где в справку смотреть, первым же постом. и раз уж у тебя прошло что то из нее ...
Раиса (2009-05-07 20:08:00) [14]sniknik © (07.05.09 16:58) [21]
Спасибо огромное. А функция преобразования дат (типа cast as Date) всё же нужна (здесь она DateSerial называется). Спасибо еще за сам запрос - это то, что нужно.
Интересно, какие еще функции есть?
sniknik (2009-05-07 16:58:00) [15]> Это тяжелое ограничение, выпадает конец года на интервал расчета.
да ничего тяжелого, просто это второй вариант, чего 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 делать пакет команд, объявлять переменные, чтобы можно было в одном месте инициализировать было бы другое дело, но чего нет того нет. лучше на клиенте условие проверить и выполнить нужный из запросов.
Anatoly Podgoretsky (2009-05-07 16:44:00) [16]Это тяжелое ограничение, выпадает конец года на интервал расчета. Но вообще то это терпимо.
Я думаю, что и Оракле есть вариант получения DayOfYear, а с ним обычные скалярные вычисления.
Игорь Шевченко (2009-05-07 16:31:00) [17]Anatoly Podgoretsky © (07.05.09 16:24) [18]
Я подобную задачу решал, но у меня было условие, чтобы начальная дата не превышала конечную (месяц+день), одним запросом, но на оракле - он умеет с датами вытворять кучу преобразований.
Anatoly Podgoretsky (2009-05-07 16:24:00) [18]А надо в промежутках от 28.21 по 31.12 и от 01.01 по конец.
Вот поэтому и два запроса и объединение (частный случай один запрос).
Ну или тоже самое в OnFilterRecord, но уже по всему массиву данных.
Я задачу решал через JulianDay в это Дельфи DayOfYear, не путать с JulianDate, хотя и через нее можно решать, но у меня в СУБД не было поддержки, только JulianDay - оно чем удобно, что не надо самому преобразовывать в количество дней с 1 января любого года. Расчет очень простой. Мне как раз нужен был интервал в 16 дней. Нужен только анализ на один или два запроса.
Игорь Шевченко (2009-05-07 15:46:00) [19]
> с учетом выше сказано про переход через год
можно и без перехода, отсеять в фильтре тех, у кого дата рождения с 02.05 до 28.12 - в остатке получатся нужные персоны.
Anatoly Podgoretsky (2009-05-07 15:32:00) [20]> Раиса (07.05.2009 15:02:14) [14]
Фильтр видимо не пойдет, а вот OnFilterRecord вполне, с учетом выше сказано про переход через год