Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2010, 16:14   #1
Goldcoding
Пользователь
 
Регистрация: 04.01.2010
Сообщений: 66
По умолчанию Помогите с запросом MS SQL

Есть вот такой запрос Z:

Select ID, StartDate, EndDate from table1

Результат запроса Z:

ID StartDate EndDate
53 31.01.09 05.06.09
54 31.02.09 01.03.09
55 31.02.09 05.04.09

Нужно средствами SQL разложить каждый промежуток времени по месяцу, т.е. выглядеть должно вот как:

ID MonthYear

53 01.09
53 02.09
53 03.09
53 04.09
53 05.09
53 06.09
54 02.09
54 03.09
55 02.09
55 03.09
55 04.09

Можете пожалуйста подсказать хоть направление в котором искать ответ. Заранее пасиб
Goldcoding вне форума Ответить с цитированием
Старый 04.01.2010, 16:39   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

...order by StartDate
mihali4 вне форума Ответить с цитированием
Старый 04.01.2010, 16:43   #3
Goldcoding
Пользователь
 
Регистрация: 04.01.2010
Сообщений: 66
По умолчанию

mihali4, что-то не понял ответа, сортировка здесь не причем... я вижу выход только через временные таблицы, но это слишком ресурсоемко....
Goldcoding вне форума Ответить с цитированием
Старый 04.01.2010, 17:33   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

приблизительно так
substring(convert(varchar,d,104),4, 8)
или year(d). month(d) day(d)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.01.2010 в 17:35.
evg_m вне форума Ответить с цитированием
Старый 04.01.2010, 18:23   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я тоже другого варианта не вижу..
а почему - "ресурсоёмко"? Нормально, размер выходной таблицы получается равным размеру выборки....
а заполнять таблицу лучше в процедуре, возвращающей табличное значение, на самом сервере - и в ней крутить цикл от месяца начальной даты до месяца конечной даты.. по каждому ID

p.s. кстати, можно попытаться по другом решить - сначала заполнить временную табличку всех возможных месяцев, а потом связать её с исходной и делать выборку..
может получиться достаточно красиво
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.01.2010, 19:39   #6
Goldcoding
Пользователь
 
Регистрация: 04.01.2010
Сообщений: 66
По умолчанию

Вот решение, помогли на другом форуме:
Код:
DECLARE @tbl TABLE(id INT, Startdate DATETIME, EndDate DATETIME)
 
INSERT INTO @tbl
SELECT 53, '20090131', '20090605' UNION all
SELECT 54, '20090228', '20090301' UNION all
SELECT 55, '20090228', '20090405'
 
 
SELECT
        t.id,
        RIGHT(CONVERT(VARCHAR, DATEADD(MONTH, v.number, StartDate), 4), 5)
FROM @tbl t
        join master..spt_values v ON v.number <= DATEDIFF(MONTH, t.StartDate, t.EndDate) and v.type = 'P'
WHERE id in(53, 54, 55)
ORDER BY 1, 2
Goldcoding вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с SQL-запросом! lordaleksej БД в Delphi 2 03.12.2009 22:55
Помогите с SQL-запросом FleshDro SQL, базы данных 15 28.07.2009 13:32
Помогите с SQL запросом DDmitriy Microsoft Office Access 4 07.05.2009 15:51
SQL. Помогите с запросом. fluxion БД в Delphi 2 27.12.2007 08:01
Помогите с SQL запросом. Monoflextor БД в Delphi 12 29.04.2007 16:53