Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL. Как вывести список дат по диапазону?


Лёша ©   (2009-03-31 12:54:00) 

Нужно, что б заработал запрос вида: я ему даю критерий, напимер
where dates >= '01.01.2009' and dates<= '01.02.2009'  

а он мне вернул список всех дат по дням в диапазоне:
'01.01.2009'
'02.01.2009'
'03.01.2009'
...
'01.02.2009'

Можно создать таблицу с датами на много лет и тянуть из нее.
Но, думаю, есть нормальное решение. К тому же, как заполнить эту таблицу?

MSSQL.


Ega23   (2009-03-31 15:41:00) [1]


> у тебя что версия mssql 7.x?


Гляди-ка, точно семёрка... О как, я всю дорогу был уверен, что двухтысячник...
Блин, где-ж я его откопал-то?


sniknik   (2009-03-31 15:28:00) [2]

> не прошло. на table заматерилось.
> счас проверю.
вроде и на 2000м работает... че то у тебя там не так.


Лёша   (2009-03-31 15:25:00) [3]

Так и знал, что надо будет через .. делать.
Ладно, всем спасибо.


sniknik   (2009-03-31 15:04:00) [4]

> не прошло. на table заматерилось.
у тебя что версия mssql 7.x? табличные переменные вроде как с 2000го ввели (или с 2005го?). счас проверю.


Anatoly Podgoretsky   (2009-03-31 15:02:00) [5]


> Не пойдет. Нужен запрос и на MSSQL.

Для этой задачи MSSQL не нужен.


Ega23   (2009-03-31 14:51:00) [6]


> нафига везде процедуры? тут простой пакет команд легко справится.


Если честно, то у меня почему-то DECLARE @res table (dt datetime);не прошло. на table заматерилось. А в процедуру обернул, чтобы временную таблицу не дропать...  :)


sniknik   (2009-03-31 14:47:00) [7]

> Как мне вывести лог состояний на каждый день?
примерно так (вставить в ADODataSet, перед вызовом задать параметры - даты без времени, такие же как должны быть в логе)

SET NOCOUNT ON
DECLARE @dt1 datetime
DECLARE @dt2 datetime
SET @dt1 = :dt1
SET @dt2 = :dt2

DECLARE @res table (dt datetime);

WHILE (@dt1<=@dt2)
BEGIN
INSERT INTO @res (dt) values (@dt1)
SET @dt1 = DATEADD(dd,  1, @dt1)
END

SELECT DISTINCT dt, [Состояние] FROM @res r
LEFT JOIN [лог событии] ON r.dt = l.[Дата]
SET NOCOUNT OFF


Ega23 ©   (31.03.09 14:14) [6]
нафига везде процедуры? тут простой пакет команд легко справится.


Ega23   (2009-03-31 14:14:00) [8]


if exists (select * from sysobjects where id = object_id(N'[S_DatesProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [S_DatesProc]
go

CREATE PROCEDURE S_DatesProc
 @dt1 datetime = 0,
 @dt2 datetime = 0
As
Set Nocount On
Declare
 @i1 int,
 @i2 int;

Set @i1=cast(@dt1 as int);
Set @i2=cast(@dt2 as int);

create table #res(dt datetime);

while (@i1<=@i2)
begin
 insert into #res (dt) values (cast(@i1 as datetime));
 Set @i1=@i1+1;
end;

Select * from #res

GO

exec S_DatesProc @dt1='2009-03-01', @dt2='2009-04-01';


Лёша   (2009-03-31 13:40:00) [9]


> ИМХО, таблица вполне нормальное решение. Иногда и в других
> задачах вполне может пригодиться.

Для других задач создам view.

Пока вижу варианты:
1. УДФ, которая инкрементит начальную дату.
2. Получаем нумерованый список, по нему добавляем дни к дате.

Ещё?


Sergey13   (2009-03-31 13:24:00) [10]

> [0] Лёша   (31.03.09 12:54)
> Можно создать таблицу с датами на много лет и тянуть из
> нее. Но, думаю, есть нормальное решение.
ИМХО, таблица вполне нормальное решение. Иногда и в других задачах вполне может пригодиться.

> К тому же, как заполнить эту таблицу?

Ну если не придумаешь - посади операторов набивать. 8-)


Лёша   (2009-03-31 13:18:00) [11]

Не пойдет. Нужен запрос и на MSSQL.


NieL   (2009-03-31 13:12:00) [12]

Можно обойтись без запроса, и сделать так:


 dtStart, dtEnd: TDateTime;



with TStringList.Create do
   try
     dtStart := StrToDateTime('01.01.2009');
     dtEnd := StrToDateTime('01.02.2009');
     repeat
       Add(DateTimeToStr(dtStart));
       dtStart := IncDay(dtStart);
     until
       dtStart = dtEnd;

     ShowMessage(Text);

   finally
     Free;
   end;


Лёша   (2009-03-31 13:10:00) [13]

Или более общая задача.
У меня есть лог событии типа (Дата, Состояние), но не на каждый день, а на день, когда состояние менялось.

Как мне вывести лог состояний на каждый день?


Наверх

Титульная страница Поиск, карта сайта Написать письмо