![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите написать запрос на select [MSSQL]
greg123 © (2008-09-11 17:51:00)Подскажите пожалуйста как написать запрос на выборку уз таблицы T1, у которой есть 2 поля месяц и год - оба smallint.
Необходимо отобрать только те записи, у которых диапазон этих полей от декабря 2006 до января 2007.
select FAM,IM,OTCH from T1
where ((rollyear>=2006 and rollmonth>=12) and (rollyear<=2007 and rollmonth<=1)) - не работает :(
Заранее спасибо.
sniknik (2008-09-12 01:24:00) [1]> Такая разбивка может иметь смысл - например, если он часто строит выборки с разбивкой по месяцам.
не очень большой смысл, т.к. в MSSQL есть более нормальный вариант.
при "разобранной" дате ее придется "собирать" для отображения, периоды отбирать с мелкими, но проблемами, вроде той что в этой ветке, а если ввести дублирующее поле с датой тогда будут другие с вводом и синхронизацией.
в нормальном варианте потребуется только одно поле с датой, а для выборок по месяцам ввести вычисляемое(т.е. собственно поля нет, значение вычисляется при обращении) поле с индексом (там есть переключатель котрый позволяет построить индекс по "воздуху")... тогда, если поле не отображать, не обращаться к нему (а вроде и незачем, отображать только нормальную дату), не будет пересчета на выборках, но при вносе/изменении все само синхронизируется, а для выборок используется индекс, а не значение, т.е. группировка/разбивка по месяцам будет максимально быстрой т.к. по индексу.
т.е. эффективнее эффективности только эффективность без гемороя... что и дает 2-й вариант.
DrPass (2008-09-11 23:27:00) [2]
> Anatoly Podgoretsky © (11.09.08 18:53) [8]
Такая разбивка может иметь смысл - например, если он часто строит выборки с разбивкой по месяцам. В этом случае будет эффективнее хранить год/месяц отдельно, чем каждый раз выцеплять его из даты
Anatoly Podgoretsky (2008-09-11 18:53:00) [3]Личные извращения над датами, до добра не доводят.
Автор в любой СУБД есть тип ДАТА
Правильный$Вася (2008-09-11 18:30:00) [4]
> Оригинально
очень старый трюк
особенно для тех, кто работал с DBF
Ega23 (2008-09-11 18:10:00) [5]
> rollyear * 100 + rollmonth
Оригинально. Буду иметь ввиду. Спасибо.
greg123 (2008-09-11 18:05:00) [6]Большое спасибо, всё заработало (всё работает без приведения типа)
Правильный$Вася (2008-09-11 18:01:00) [7]
> DrPass © (11.09.08 17:56) [3]
интересно, к какому типу будет приведен результат
smallint маловат будет...
DrPass (2008-09-11 17:56:00) [8]вернее, rollyear * 100 + rollmonth between 200612 and 200701
DrPass (2008-09-11 17:55:00) [9]rollyear * 100 + rollmonth >= 200612 and rollyear * 100 + rollmonth <= 200701
Правильный$Вася (2008-09-11 17:54:00) [10]
> не работает
естественно, т.к.rollmonth>=12 аnd rollmonth<=1противоречат друг другу