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

Откуда:
Сообщений: 54
Доброго времени суток,
есть такая необходимость сформировать запрос с датами, например
01.01.2012
02.01.2012
03.01.2012
...
31.01.2012
Как в SQL это сделать? На любом языке программирования это делается элементарно циклом, а как здесь не знаю.
Помогите пожалуйста.
Спасибо.
30 май 12, 11:20    [12635989]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Gizmor
На любом языке программирования это делается элементарно циклом, а как здесь не знаю.

либо так же, либо CTE, либо запросом над множеством
30 май 12, 11:22    [12636001]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
Дмитрий_sql
Member

Откуда:
Сообщений: 35
По конкретнее можно? Какие данные в таблице и что надо вывести?
30 май 12, 11:23    [12636007]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
Gizmor
Member

Откуда:
Сообщений: 54
Дмитрий_sql,

да просто в столбик надо вывести даты за определенный период
30 май 12, 12:17    [12636383]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Gizmor, в поиск.
30 май 12, 12:22    [12636437]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Gizmor, ну тогда так
+

CREATE FUNCTION dbo.GetNums(@n AS BIGINT) RETURNS TABLE
AS
RETURN
WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
L5 AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS n FROM L5)
SELECT TOP(@n) n FROM Nums ORDER BY n;
GO

DECLARE
@startdt AS DATE = '20120101',
@enddt AS DATE = '20121231';
SELECT DATEADD(day, n - 1, @startdt) AS dt
FROM dbo.GetNums(DATEDIFF(day, @startdt, @enddt) + 1) AS Nums;

30 май 12, 12:23    [12636440]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
Дмитрий_sql
Member

Откуда:
Сообщений: 35
Gizmor
Дмитрий_sql,

да просто в столбик надо вывести даты за определенный период


Попробуй так:

with ss as (
select convert( datetime, '1.1.2010', 104) as id
union all
select id+1 from ss
where id< convert( datetime, '1.2.2010', 104)
)

select * from ss
30 май 12, 16:09    [12638621]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
Gizmor
Member

Откуда:
Сообщений: 54
Дмитрий_sql,

спасибо большое, получил то, что надо.
Теперь разберусь как это все работает.
30 май 12, 17:15    [12639200]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
Дмитрий_sql,

Вообще говоря пользоваться рекурсией для генерации последовательности плохая практика.
особенно если нужно много данных.

решил сравнить со способом который обычно использую(только для 100000 дат):
set statistics time on
go
with N10 as(select * from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))x(x))
,N100000 as(
select ROW_NUMBER()over(order by (select 1))N
from N10 a, N10 b, N10 c, N10 d, N10 e
)
select DATEADD(DD,N,'2011-12-31')day
from N100000
go
with ss as (
select convert( datetime, '1.1.2012', 104) as id
union all
select id+1 from ss
where id< convert( datetime, '15.10.2285', 104)
)
select * from ss 
option(maxrecursion 0)


(100000 row(s) affected)

SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 1039 ms.

(100000 row(s) affected)

SQL Server Execution Times:
CPU time = 1594 ms, elapsed time = 2008 ms.
И чем больше количество - тем больше разница.
31 май 12, 07:12    [12641098]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
Gizmor,

DECLARE @first DATETIME = '20120501',
@end DATETIME = '20120601'

;WITH list(d) as
(
SELECT @first
UNION ALL 
SELECT d + 1 FROM list WHERE d < @end
)

SELECT * FROM list
OPTION (MAXRECURSION 0)
31 май 12, 13:28    [12643281]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
Дмитрий_sql
Member

Откуда:
Сообщений: 35
ilyaBS
Gizmor,

DECLARE @first DATETIME = '20120501',
@end DATETIME = '20120601'

;WITH list(d) as
(
SELECT @first
UNION ALL 
SELECT d + 1 FROM list WHERE d < @end
)

SELECT * FROM list
OPTION (MAXRECURSION 0)


Я уже это предлагал. И Knyazev Alexey показал менее ресурсоёмкий механизм с помощью декартового произведения одной и той же таблицы для 100 000 значений.
31 май 12, 14:19    [12643757]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос по датам  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
[quot Дмитрий_sql]
ilyaBS
Gizmor,
Я уже это предлагал. И Knyazev Alexey показал менее ресурсоёмкий механизм с помощью декартового произведения одной и той же таблицы для 100 000 значений.


Это был я :)
31 май 12, 14:24    [12643802]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить