Текущий архив: 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