Главная страница
    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.01 c
14-55265
Сатир
2002-05-10 17:59
2002.06.17
Потоки


3-54974
Vitamin
2002-05-22 14:25
2002.06.17
Как передать результат запроса в Exel?


1-55200
Коля
2002-06-05 02:17
2002.06.17
try в TRegistry


1-55195
студент
2002-06-05 09:06
2002.06.17
!!!Help!!! Проверка количества свободной памяти


1-55164
PTE
2002-06-04 12:47
2002.06.17
Как отчистить содержимое StringGrid?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский