Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.17;
Скачать: CL | DM;

Вниз

Выборка по нестандартным месяцам   Найти похожие ветки 

 
Pavel_Malishev   (2002-05-21 23:03) [0]

Здравствуйте, мастера!
Подскажите, пожалуйста, решение следующей задачки.
Требуется произвести выборку данных из БД (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.
Подскажите, как тут можно выкрутиться, без написания собственной хранимой процедуры по рассчету календаря.
А может все гораздо проще?


 
Mambet   (2002-05-22 05:16) [1]

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


 
Lusha ©   (2002-05-22 09:34) [2]

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


 
DmitryK   (2002-05-22 11:22) [3]


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


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

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

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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.06.17;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.019 c
14-55297
Igorek
2002-05-03 00:42
2002.06.17
Кто как решает алгоритмические трудности?


3-54991
Nebula
2002-05-20 11:43
2002.06.17
ADO.Recordset


1-55189
Stass
2002-06-05 00:06
2002.06.17
MDI


3-54970
Sergant
2002-05-22 13:02
2002.06.17
Копирование баз данных с интервалом 1 час


3-55007
Proton
2002-05-19 19:34
2002.06.17
Чем порекомендуетк пользоваться при созании отчетов?