Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Рассчитать первые даты кварталов между двумя датами.  [new]
BloodMK
Member

Откуда:
Сообщений: 15
Доброго времени суток, уважаемые профессионалы.

Задача, поставленная передо мной сложнее, но я прошу совета лишь в относительно несложной её части.

У меня есть две даты: начальная и конечная. И есть 4 типа периода : (месяц/квартал/полугодие/год).

Рассчитать количество периодов между двумя датами очень легко, помогает функция DATEDIFF().

Но мне нужно вывести таблицу с списком первых дат для конкретного периода.

Я в ступоре, можно ли реализовать такое возможностями SQL? К примеру, для квартала.
17 апр 12, 19:27    [12429607]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
iljy
Member

Откуда:
Сообщений: 8711
BloodMK,

легко.
DECLARE @t1 TABLE (Start smalldatetime, Fin smalldatetime) 

insert into @t1
select '20120210','20120313' union all
select '20120222','20120410'

select t1.*, DATEADD(q,number,0) m1	
from @t1 t1 join  master..spt_values v on v.number between DATEDIFF(Q,0, Start) and DATEDIFF(Q, 0, Fin)
where type = 'P'
17 апр 12, 19:32    [12429635]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
BloodMK
Member

Откуда:
Сообщений: 15
iljy,

Всё прекрасно для квартала, месяца или года. Огромное спасибо.

Нерешённым остаётся лишь вопрос с полугодием...
17 апр 12, 19:37    [12429646]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
iljy
Member

Откуда:
Сообщений: 8711
BloodMK
iljy,

Всё прекрасно для квартала, месяца или года. Огромное спасибо.

Нерешённым остаётся лишь вопрос с полугодием...

А какие проблемы? Вы можете решить для месяца, соответственно вы можете округлить до 6 месяцев.
17 апр 12, 19:43    [12429664]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
aleks2
Guest
declare @dt1 datetime, @dt2 datetime
set @dt1='20120201'
set @dt2='20120801'

;with
quarters as
(select dateadd(quarter, datediff(quarter, 0, @dt1), 0) q
 union all
 select dateadd(quarter, 1, q.q) q
 FROM quarters q
 WHERE dateadd(quarter, 1, q.q)<=@dt2
)
select * from quarters WHERE q>=@dt1


ЗЫ. Какбе 2 квартала = полгода. Какие проблемы?
17 апр 12, 19:45    [12429666]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
BloodMK
Member

Откуда:
Сообщений: 15
iljy,

Я поспешил с другими периодами. При попытке заменить q на y даты получаются странные.
17 апр 12, 19:48    [12429680]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
iljy
Member

Откуда:
Сообщений: 8711
BloodMK
iljy,

Я поспешил с другими периодами. При попытке заменить q на y даты получаются странные.

Потому что Y - это Day of Year
17 апр 12, 19:50    [12429687]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
BloodMK
Member

Откуда:
Сообщений: 15
iljy,

Ещё раз спасибо. Век живи, век учись.

А всё же, что делать с полугодиями?
17 апр 12, 19:57    [12429713]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
BloodMK
Member

Откуда:
Сообщений: 15
BloodMK,

Я в SQLе не профессионал, к сожалению, опыта работы с датами не имею, и как правильно округлить пока не знаю. Если мне хотя бы разъяснят принцип, то я смогу сделать это. Но без этого не получается..
17 апр 12, 20:15    [12429758]     Ответить | Цитировать Сообщить модератору
 Re: Рассчитать первые даты кварталов между двумя датами.  [new]
iljy
Member

Откуда:
Сообщений: 8711
BloodMK,

DECLARE @t1 TABLE (Start smalldatetime, Fin smalldatetime) 

insert into @t1
select '20120210','20120313' union all
select '20120222','20130410'

select t1.*, DATEADD(M,number * 6,0) m1	
from @t1 t1 join  master..spt_values v on v.number between DATEDIFF(m,0, Start)/6 and DATEDIFF(m, 0, Fin)/6
where type = 'P'
17 апр 12, 20:41    [12429839]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить