Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Выпуск № 385
от 15.08.2007, 12:05

Администратор:Gh0stik
В рассылке:Подписчиков: 338, Экспертов: 40
В номере:Вопросов: 1, Ответов: 5


Вопрос № 97931: Добрый!!! Помогите в состовлении запроса: Есть поле типа TDateTime и Integer - Дата договора и срок договора в месяцах, собсно вопрос: Можно ли в одном запросе закончился ли срок договора или нет? все что было у меня по SQL перек...

Вопрос № 97.931
Добрый!!!

Помогите в состовлении запроса:
Есть поле типа TDateTime и Integer - Дата договора и срок договора в месяцах, собсно вопрос:
Можно ли в одном запросе закончился ли срок договора или нет?
все что было у меня по SQL перекопал, но ничего не нашел, возможноли такое?

Приложение:

Отправлен: 10.08.2007, 11:42
Вопрос задал: CjJoker (статус: 3-ий класс)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Архангельский Андрей Германович
Здравствуйте, CjJoker!

Для этого OrderCount тоже должен быть типа Date, тогда даты можно складывать.
Либо использовать UDF - есть функции AddDay, AddMonth и т.п.

Но лучше в таблицу записывать не срок в днях, а дату окончания срока. Тогда все запросы резко упрощаются. Вычисление даты окончания срока перенести в клиентское приложение - там все это много проще.
---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 10.08.2007, 11:55

Отвечает: Shveps
Здравствуйте, CjJoker!
А может так:
SELECT * FROM OrderTab
Group By OrderDate HAVING (OrderDate + OrderCount) = :DateNow;
---------
Пиво ф топку !!! Водку Тоже !!!
Ответ отправил: Shveps (статус: 8-ой класс)
Ответ отправлен: 10.08.2007, 11:55

Отвечает: Mishell
Здравствуйте, CjJoker!
хм, естесвенно...
во-первых вы проверяете точное совпадение даты, а надо проверять превышение:
OrderDate + OrderCount < :DateNow
во-вторых если в месяцах - то надо добавлять кол-во месяцев, а не кол-во дней (т.е. если просто прибавить int к datetime - то прибавяться дни)
хотя как по мне странно хранить срок договора в месяцах - имхо лучше в днях - т.к. кол-во дней в месяце величина не постоянная
но я смотрю Вы указываете типы данных Дельфи, а не SQL - тогда для добавления кол-ва месяцев Вам можно воспользоваться ф-цией IncMonth из модуля DateUtils, а полученную дату подставлять в запрос (это если есть такая возможность), но я бы все-равно хранил срок в днях...
Ответ отправил: Mishell (статус: 5-ый класс)
Ответ отправлен: 10.08.2007, 12:27

Отвечает: Примак Руслан Николаевич
Здравствуйте, CjJoker!

Есть UDF функция addMonth в fbudf.dll, которая возвращает дату увеличенную на соответствующее количество месяцев.

Соответственно, если OrderDate - дата заключения договора, OrderCount - количество месяцев, DateNow - проверяемая дата, то запрос выбирающий договора, действующие относительно даты DateNow выглядит следующим образом:

select
*
from
ORDERTAB
where
:DateNow > AddMonth(OrderDate, OrderCount)

Для того, что-бы воспользоваться функцией AddMonth, вам необходимо разместить файл fbudf.dll в каталоге UDF вашего сервера и зарегистрировать ее в соответствующей БД:
declare external function addMonth
timestamp, int
returns timestamp
entry_point 'addMonth' module_name 'fbudf';
Ответ отправил: Примак Руслан Николаевич (статус: 3-ий класс)
Ответ отправлен: 10.08.2007, 15:10

Отвечает: Щекунов Владимир Леонидович
Здравствуйте, CjJoker!
Не совсем понятно с какой конкретно БД Вы работаете.
В MS SQL Server есть функции для работы с датами: DATEADD(datepart, number, date) - добавляет к дате date определённое кол-во (number) дней, минут и т.д. (аргумент datepart), DATEDIFF(datepart, startdate, enddate) - разница между указанными частями двух дат. Более развёрнутую информацию по этим и другим функциям иожно почерпнуть в справочной системе.
В Interbase/Firebird можно из поздней даты вычесть раннюю дату: END_DATE - START_DATE. Результат - число типа NUMERIC(18,9), выражающее интервал в днях. Можно к дате прибавить целое число (DATE + n), но в n должно быть количество дней.
---------
Настоящий программист сначала долго думает, чтобы потом ничего не делать.
Ответ отправил: Щекунов Владимир Леонидович (статус: 1-ый класс)
Ответ отправлен: 10.08.2007, 18:53


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.54 beta от 01.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное