Форум: "Базы";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];
ВнизВыборка по нестандартным месяцам Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c