Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-55263
Дремучий
2002-05-11 23:05
2002.06.17
Почувствуй себя МАСТЕРОМ!


4-55367
Darlok
2002-04-16 15:11
2002.06.17
Помогите!!!!


6-55238
DiGiTaL
2002-04-07 07:59
2002.06.17
Как с помощью Аутлука забрать почту?


1-55067
vlv
2002-06-05 18:12
2002.06.17
Com - объекты


8-55234
dmitriyk
2002-01-31 03:22
2002.06.17
Как качественно перевести цветную картинку в черно-белую





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский