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

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

Выборка по нестандартным месяцам [D5, MSSQL]


Pavel_Malishev ©   (2002-05-21 23:03:00) 

Здравствуйте, мастера!
Подскажите, пожалуйста, решение следующей задачки.
Требуется произвести выборку данных из БД (MSSQL2000) по месяцам.
НО! Дело в том, что на нашем предприятии отчетный месяц начинается с 21-го числа предыдущего месяца. Т.е. январь 2002 начинается с 21 декабря 2001 и заканчивается 20 январем 2002 года. Поэтому стандартная форма запроса с конструкциями типа
... month(mydate)... или ...GROUP BY DATEPART(mm,mydate)... не проходит. Сдвиг даты с помощью DATEADD на 8..11 тоже не получается, т.к. я не смог найти в MSSQL2000 команд выдачи последнего дня месяца (тоесть определение 28,29,30 или 31 дней в месяце, чтобы сдвиг был точным), набодобие LAST_DAY в Oracle.
В идеале все должно быть так. По month определяем реальный месяц, затем каким то образом узнаем, сколько в нем дней, и ставим значение в DATEADD.
Подскажите, как тут можно выкрутиться, без написания собственной хранимой процедуры по рассчету календаря.
А может все гораздо проще?


Pavel_Malishev   (2002-05-22 18:53:00) [1]

Всем спасибо за ответы.
Замутил-таки все через DATEADD, выделяя кличество дней, отнимая их от текущей даты (получаем последний день предыдущего месяца) и т.д.


DmitryK   (2002-05-22 11:22:00) [2]


> Батенька, читайте документацию по функции DATEADD внимательнее.
> У нее есть возможность прибавлять именно месяц...


Насколько я понял месяцы то прибавлять как раз-таки и не надо.

Можно конечно расчитывать данное значение прямо в запросе, но тогда ты не сможешь воспользоваться преимуществами индексов, и при достаточно большом количестве значений в таблицы запрос будет работать непозволительно долго.

Я бы предложил провести некоторую реструктуризацию базы. Добавь в данную таблицу однобайтовое поле, в котором будет хранится номер месяца (но уже не календарный, а расчетный с учетом сдвига). Это поле запросто можно заполнять тригерром на добавление/изменение записей (элементарно).

Ну а расчет месяца можно построить на стандартной конструкции CASE. Если дата меньше 21 то расчетный_месяц=календарному, иначе если календарный_месяц<12 то расчетный_месяц=календарный-1 иначе расчетный_месяц=1

Только в этой схеме не учитывается сдвиг в годах. Ну это уже как тебе надо так и сделаешь :)


Lusha   (2002-05-22 09:34:00) [3]

Батенька, читайте документацию по функции DATEADD внимательнее. У нее есть возможность прибавлять именно месяц...


Mambet   (2002-05-22 05:16:00) [4]

От первого дня месяца отними один день - получишь последний день предыдущего месяца.


Наверх

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