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

Откуда:
Сообщений: 27
Как создать запрос результатом которого будет 365 строк в каждой из которой будет находиться дата на день больше предыдущей

01.01.2003
02.01.2003
03.01.2003
.........
16 окт 03, 09:02    [378728]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
MFT400
Guest
select convert(datetime, '20030101') + n3.num*100+n2.num*10+n1.num as date from
(select 0 as num union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) n1,
(select 0 as num union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) n2,
(select 0 as num union select 1 union select 2 union select 3)n3
16 окт 03, 09:07    [378738]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Тогда уж
select top 365 * from(

select convert(datetime, '20030101') + n3.num*100+n2.num*10+n1.num as date from
(select 0 as num union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) n1,
(select 0 as num union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) n2,
(select 0 as num union select 1 union select 2 union select 3)n3
) a order by date
16 окт 03, 09:31    [378775]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
Revita
Member

Откуда:
Сообщений: 27
порылась немного в форуме и творчески преобразовав найденное наваяла вот что

select top 365 dateadd(dd, -Day(getdate()), dateadd(mm,-Month(getdate())+1,getDate())) +(select count(*) from master..sysobjects where id<=a.id) AS d
from master..sysobjects a Order by d

по-моему неплохо:-) мож кто какие замечания внесет? спасибо за оперативные ответы
16 окт 03, 10:16    [378864]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Всё бы ничего, да только у меня запрос https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=53931#378775 имеет стоимость 0,0576 против 0,798, которую дает этот
select top 365 dateadd(dd, -Day(getdate()), dateadd(mm,-Month(getdate())+1,getDate())) +

(select count(*) from master..sysobjects where id<=a.id) AS d
from master..sysobjects a Order by d
16 окт 03, 10:36    [378902]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
Revita
Member

Откуда:
Сообщений: 27
Сенкс.. тогда воспользуюсь, конечно вашим запросом. Была бы благодарна за ответ - как оценить эту стоимость, для дальнейшей, так сказать, плодотворной работы.

ну что поделать.. не все же умники...)
17 окт 03, 02:36    [380374]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
как оценить эту стоимость, для дальнейшей, так сказать, плодотворной работы.
Например, в QA перед выполнением запроса нажать Ctrl+K, а после выполнения посмотреть на соответствующей закладочке.
17 окт 03, 06:51    [380418]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
О! У такого запроса
select top 365 * from(

select convert(datetime, '20030101') + n3.num*100+n2.num*10+n1.num as date from
(select 0 as num
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) n1,
(select 0 as num
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) n2,
(select 0 as num
union all select 1
union all select 2
union all select 3)n3
) a order by date
план ещё круче!!! Стоимость составила у меня 0,0191.
17 окт 03, 14:31    [381370]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
bushmen
Member

Откуда: г. Москва
Сообщений: 828
2 tpg :
А сколько это в евро будет?
17 окт 03, 14:36    [381390]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
лучшее - враг хорошего, а хороший вариант - это банальная табличка с календарем, иначе потом вопрос возникает, как определять выходные, а далее праздники, а вот с праздниками уже никак
18 окт 03, 09:05    [382361]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Нарастающая дата в запросе: произвольный период  [new]
IgorTaDaDaDa
Member

Откуда: Australia
Сообщений: 88
tpg,

Возможно ли изменить этот запрос для работы с произвольным количеством дней?

DECLARE
@datefrom datetime,
@dateto datetime,
@diff int
SET @datefrom = '2001-07-15'
SET @dateto = '2007-07-18'

SELECT @diff = DATEDIFF(day, @datefrom, @dateto)+1
--2195
SELECT TOP 2195 * ...

или в этом случае лучше создать таблицу-календарь?

Спасибо
15 июл 11, 08:20    [10977588]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Табличко, ИМХО, лучшэ!
15 июл 11, 08:41    [10977638]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
IgorTaDaDaDa
Member

Откуда: Australia
Сообщений: 88
tpg,

Не так красиво как выше у вас, но короче, понятнее и наверняка. Спасибо.
15 июл 11, 09:27    [10977760]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Нарастающая дата в запросе  [new]
Алексей
Member

Откуда: Москва
Сообщений: 375
IgorTaDaDaDa,

Можно вообще просто
Select CONVERT(NVARCHAR(10),DATEADD(day,Number,'20160101'),104)dt from master..spt_values Where type='p' and number<366
10 май 16, 11:43    [19152228]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
К Э П
Guest
Спасибо Алексей
10 май 16, 11:48    [19152266]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
Хе-хе )
Guest
Для подобных задач рекурсия есть
DECLARE @DateFrom date = '20160101'
, @DateTo date = '20161231'

;WITH calendar ( [dt]) AS

(SELECT  @DateFrom

       UNION ALL
SELECT
DATEADD(dd, 1, calendar.dt)
FROM calendar
WHERE calendar.dt <=  @DateTo
) SELECT dt
  FROM calendar OPTION (MAXRECURSION 0)
10 май 16, 15:40    [19153748]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая дата в запросе  [new]
LoopN
Guest
Подброшу для кучи
SELECT DATEADD(DAY,ROW_NUMBER() OVER(ORDER BY 1/0)-1,d1) ND FROM
(
	SELECT d1,CAST(REPLICATE('<r/>',DATEDIFF(DAY,d1,d2)) AS XML) X FROM
	(SELECT CAST('20130101' AS DATE) d1, CAST('20140101'AS date) d2) Z
) Z
CROSS APPLY X.nodes('r') Y(b)
10 май 16, 16:10    [19154000]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить