webForumDet fria alternativet

sp + insert av datum

4 svar · 172 visningar · startad av doggelito

doggelitoMedlem sedan juni 20003 100 inlägg
#1

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
#2

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
#3

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
#4

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
#5

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
Genererad på 375 ms · cache AV · v20260730165559-full.f96bc7eb