doggelitoMedlem sedan juni 20003 100 inlägg
har denna sp
CREATE PROCEDURE dbo.spViewTax
@Solitaxnr int,
@Startdate datetime,
@Enddate datetime
AS
SET NOCOUNT ON
Begin
Create table #temp (FNUValue varchar(50), Regdate datetime)
INSERT INTO #temp
Select FNUValue, Regdate
From tblViewTax
Where Solitaxnr = @Solitaxnr And
Regdate Between @Startdate And @Enddate
End
Select * From #temp
GO
Den insertar en massa datum samt tillhörande värde, det kan se ut så här:
2003-10-10 12:00:00 5,4
2003-10-10 12:15:00 5,3
2003-10-10 12:30:00 5,4
2003-10-10 13:00:00 5,5
Som ni ser hoppar varje post 15 minuter utom mellan 12:30 och 13:00, det är detta som är problemet, det kan finnas tomrum på x antal ställen (det ska alltid finnas poster var 15:e minut).
Kan man på nått sätt kolla om det fattas poster och i så fall göra en insert med den tiden samt värdet från föregående post? Förstod ni?
I mitt exempel ovan skulle alltså denna post behöva skapas:
2003-10-10 12:45:00 5,4
Exempel 2:
Dessa inserts görs först:
2003-10-10 00:45:00 5,2
2003-10-10 01:00:00 5,3
2003-10-10 01:30:00 5,2
Behöver då dessa inserts:
2003-10-10 00:00:00 0,0
2003-10-10 00:15:00 0,0
2003-10-10 00:30:00 0,0
2003-10-10 01:15:00 5,3
Hoppas det inte blev för krångligt! :(
LarsGMedlem sedan dec. 200012 465 inlägg
Standardlösningen för denna typ av problem är att skapa en nummertabell. Den har en kolumn av typen int och innehåller lika många poster (0,1,2, ... ) som skillnaden (räknat i 15 minuters intervall då) mellan högsta och lägsta tiden i din ursprungliga tabell.
select #temp.*, coalesce(regdate,dateadd(minute,15*numbers.intValue,<lägsta tidsvärdet i #temp>)
From numbers left join #temp
on numbers.intValue =
datediff(minute,<lägsta tidsvärdet i #temp>,regdate)/15
where intValue < datediff(minute,<lägsta>,<högsta>)/15
Ungefär. Det blir ju avsevärt enklare om du lagrar tider i stället för tal i numberstabellen, men en nummertabell är alltid bra att ha.
doggelitoMedlem sedan juni 20003 100 inlägg
Få se om jag fattar rätt:
Jag skapar en ny tabell 96 st poster.
(jag hämtar alltid ett dygn åt gången) 4 kvartar/timme *24=96
Sen hänger jag inte riktigt med på vad du gör i koden ovan.
Du gör om de befintliga tiderna till 15 min. intervaller och joinar med denna nummertabell med vad får du ut då?
Jag fattar att alla poster i nummertabellen ska ha en join annars fattas den tiden, men hur adderar jag dessa sedan till de övriga?
LarsGMedlem sedan dec. 200012 465 inlägg
Eftersom det är en outer join så kommer du att få alla poster från nummertabellen, dvs 96 stycken. För de poster i #temp där det inte finns en matchande post kommer du att få poster där alla kolumner är null. Sen kan du använda Coalesce för att översätta dessa null-värden till den rätta tiden. Du får även göra samma sak med fnuValue, dvs
coalesce(fnuValue,0)
doggelitoMedlem sedan juni 20003 100 inlägg
Tack för hjälpen LarsG! :)
Det blev en liten annan variant än vad jag först tänkt men, men!
CREATE PROCEDURE dbo.spViewTax
@Solitaxnr int,
@Startdate datetime,
@Enddate datetime
AS
Set Nocount On
Create table #temp (fnuValue varchar(50), intValue int)
Begin
Insert Into #temp
Select fnuValue, cast(datediff(minute,@Startdate,Regdate)/15 as int)
From tblViewTax
Where Solitaxnr = @Solitaxnr And
Regdate Between @Startdate And @Enddate
End
Begin
Insert Into #temp
Select 0, intValue From tblViewTaxTime
Where intValue Not In (Select intValue From #temp)
End
Select intValue, fnuValue From #temp Where intValue >0 Order by 1 asc
GO