Конференция "Базы" » Помогите написать запрос на select [MSSQL]
 
  • greg123 (11.09.08 17:51) [0]
    Подскажите пожалуйста как написать запрос на выборку уз таблицы T1, у которой есть 2 поля месяц и год - оба smallint.
    Необходимо отобрать только те записи, у которых диапазон этих полей от декабря 2006 до января 2007.

    select FAM,IM,OTCH from T1
    where ((rollyear>=2006 and rollmonth>=12) and (rollyear<=2007 and rollmonth<=1)) - не работает :(

    Заранее спасибо.
  • Правильный$Вася (11.09.08 17:54) [1]

    >  не работает

    естественно, т.к.
    rollmonth>=12 аnd rollmonth<=1

    противоречат друг другу
  • DrPass © (11.09.08 17:55) [2]
    rollyear * 100 + rollmonth >= 200612 and rollyear * 100 + rollmonth <= 200701
  • DrPass © (11.09.08 17:56) [3]
    вернее, rollyear * 100 + rollmonth between 200612 and 200701
  • Правильный$Вася (11.09.08 18:01) [4]

    > DrPass ©   (11.09.08 17:56) [3]

    интересно, к какому типу будет приведен результат
    smallint маловат будет...
  • greg123 (11.09.08 18:05) [5]
    Большое спасибо, всё заработало (всё работает без приведения типа)
  • Ega23 © (11.09.08 18:10) [6]

    > rollyear * 100 + rollmonth


    Оригинально. Буду иметь ввиду. Спасибо.
  • Правильный$Вася (11.09.08 18:30) [7]

    > Оригинально

    очень старый трюк
    особенно для тех, кто работал с DBF
  • Anatoly Podgoretsky © (11.09.08 18:53) [8]
    Личные извращения над датами, до добра не доводят.
    Автор в любой СУБД есть тип ДАТА
  • DrPass © (11.09.08 23:27) [9]

    > Anatoly Podgoretsky ©   (11.09.08 18:53) [8]

    Такая разбивка может иметь смысл - например, если он часто строит выборки с разбивкой по месяцам. В этом случае будет эффективнее хранить год/месяц отдельно, чем каждый раз выцеплять его из даты
  • sniknik © (12.09.08 01:24) [10]
    > Такая разбивка может иметь смысл - например, если он часто строит выборки с разбивкой по месяцам.
    не очень большой смысл, т.к. в MSSQL есть более нормальный вариант.
    при "разобранной" дате ее придется "собирать" для отображения, периоды отбирать с мелкими, но проблемами, вроде той что в этой ветке, а если ввести дублирующее поле с датой тогда будут другие с вводом и синхронизацией.

    в нормальном варианте потребуется только одно поле с датой, а для выборок по месяцам ввести вычисляемое(т.е. собственно поля нет, значение вычисляется при обращении) поле с индексом (там есть переключатель котрый позволяет построить индекс по "воздуху")... тогда, если поле не отображать, не обращаться к нему (а вроде и незачем, отображать только нормальную дату), не будет пересчета на выборках, но при вносе/изменении все само синхронизируется, а для выборок используется индекс, а не значение, т.е. группировка/разбивка по месяцам будет максимально быстрой т.к. по индексу.
    т.е. эффективнее эффективности только эффективность без гемороя... что и дает 2-й вариант.
 
Конференция "Базы" » Помогите написать запрос на select [MSSQL]
Есть новые Нет новых   [134435   +34][b:0][p:0.001]