Вопрос № 97931: Добрый!!!
Помогите в состовлении запроса:
Есть поле типа TDateTime и Integer - Дата договора и срок договора в месяцах, собсно вопрос:
Можно ли в одном запросе закончился ли срок договора или нет?
все что было у меня по SQL перек...
Вопрос № 97.931
Добрый!!!
Помогите в состовлении запроса:
Есть поле типа TDateTime и Integer - Дата договора и срок договора в месяцах, собсно вопрос:
Можно ли в одном запросе закончился ли срок договора или нет?
все что было у меня по SQL перекопал, но ничего не нашел, возможноли такое?
Приложение:
Отправлен: 10.08.2007, 11:42
Вопрос задал: CjJoker (статус: 3-ий класс)
Всего ответов: 5 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Архангельский Андрей Германович
Здравствуйте, CjJoker!
Для этого OrderCount тоже должен быть типа Date, тогда даты можно складывать.
Либо использовать UDF - есть функции AddDay, AddMonth и т.п.
Но лучше в таблицу записывать не срок в днях, а дату окончания срока. Тогда все запросы резко упрощаются. Вычисление даты окончания срока перенести в клиентское приложение - там все это много проще.
--------- Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Отвечает: 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 должно быть количество дней.
--------- Настоящий программист сначала долго думает, чтобы потом ничего не делать.