Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.10;
Скачать: CL | DM;

Вниз

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

 
Лёша   (2009-03-31 12:54) [0]

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

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

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

MSSQL.


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

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

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


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

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


 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:18) [3]

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


 
Sergey13 ©   (2009-03-31 13:24) [4]

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

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

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


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


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

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

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

Ещё?


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


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";


 
sniknik ©   (2009-03-31 14:47) [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:51) [8]


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


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


 
Anatoly Podgoretsky ©   (2009-03-31 15:02) [9]


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

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


 
sniknik ©   (2009-03-31 15:04) [10]

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


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

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


 
sniknik ©   (2009-03-31 15:28) [12]

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


 
Ega23 ©   (2009-03-31 15:41) [13]


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


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



Страницы: 1 вся ветка

Текущий архив: 2009.05.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
15-1236239411
ford
2009-03-05 10:50
2009.05.10
ауу


2-1238473883
Lexus315
2009-03-31 08:31
2009.05.10
Перевод величин углов


4-1209369334
Dmitry_177
2008-04-28 11:55
2009.05.10
Теуцщая позиция в файле


2-1238493524
начинающий96
2009-03-31 13:58
2009.05.10
ООП


2-1222512134
Rav
2008-09-27 14:42
2009.05.10
Как сохранить *.jpg в базу данных