![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Или более общая задача.
У меня есть лог событии типа (Дата, Состояние), но не на каждый день, а на день, когда состояние менялось.
Как мне вывести лог состояний на каждый день?