---
title: "sp + insert av datum"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/96452-sp-insert-av-datum"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "doggelito"
published: "2004-02-03T10:19:10.000Z"
updated: "2004-02-03T17:36:03.000Z"
replies: 4
views: 172
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/96452-sp-insert-av-datum"
---

# sp + insert av datum

## #1 — doggelito, 2004-02-03T10:19Z

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! :(

Permalänk: https://www.webforum.nu/p/96452

## #2 — LarsG, 2004-02-03T12:21Z

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.

Permalänk: https://www.webforum.nu/p/1268270

## #3 — doggelito, 2004-02-03T12:53Z

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?

Permalänk: https://www.webforum.nu/p/1268292

## #4 — LarsG, 2004-02-03T13:43Z

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)
```

Permalänk: https://www.webforum.nu/p/1268325

## #5 — doggelito, 2004-02-03T17:36Z

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
```

Permalänk: https://www.webforum.nu/p/1268497

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/96452-sp-insert-av-datum
