Har en cursor som hämtar värden från en tabell. Om jag har ett numeriskt värde som jag vet är 5,7123123 så blir det 6 när cursorn hämtat det. Varför? Går det att hindra detta? Skulle gissa att du fått in en implicit konvertering till integer någonstans. Det är en lagrad procedur i MSSQL 2000 som skapar x antal rader (beroende på de startdatum och slutdatum som kommer in) i en tabell. Vissa kolumner i denna tabell fylls med värden från en annan tabell och det är här det blir fel någonstans. Så här ser min SP ut: Hej, Tack så mycket för det snabba svaret. Testade med "/7.0" istället för "/7" och resultatet blev samma. Hej! Löste det med att CAST:a om den till char istället, men skall testa att göra som du föreslog Håkan. IOM detta anser jag detta som löst.Avrundar Cursor värden automatisk?
Sv: Avrundar Cursor värden automatisk?
Vilket programspråk använder du? Kan du visa hur koden ser ut där du hämtar värdet?Sv:Avrundar Cursor värden automatisk?
<code>
CREATE PROCEDURE calcTimeByDepAndDay
@startdate varchar(50),
@stopdate varchar(50),
@department varchar(50),
@normstartdate datetime,
@normstopdate datetime
AS
DECLARE @EmpName varchar(50), @Dep varchar(8), @Ftg varchar(50), @Nt numeric(5)
DECLARE emp_cursor CURSOR
FOR SELECT Distinct dbo.Company.CompanyName,dbo.Employee.Department, dbo.Employee.EmployeeName, - + dbo.Employee.WorkTimeWeek/7 FROM Employee INNER JOIN
dbo.Company ON dbo.Employee.CompanyNr = dbo.Company.CompanyNr Where dbo.Employee.Department = @department And dbo.Employee.PersonalKategory = '01'
OPEN emp_cursor
DELETE FROM normdate
set nocount on
declare @lonetyp varchar(50), @kat varchar(50), @underkat varchar(50)
FETCH NEXT FROM emp_cursor
INTO @Ftg, @Dep, @EmpName, @Nt
WHILE (@@FETCH_STATUS = 0)
Begin
select @kat = 'Arbetstid' , @underkat = 'Normtid' , @lonetyp = 'NT'
while (@normstopdate >= @normstartdate)
BEGIN
insert into normdate values (@kat, @underkat, @Ftg, @Dep,@EmpName , @lonetyp, @normstartdate, @Nt)
select @normstartdate = dateadd(day, 1, @normstartdate)
END
FETCH NEXT FROM emp_cursor into @Ftg, @Dep, @EmpName, @Nt
End
CLOSE emp_cursor
DEALLOCATE emp_cursor
</code>
Det är i beräkningnen "- + dbo.Employee.WorkTimeWeek/7" det blir fel. Skall returnera ca 5,71 men när värdet läggs in i den nya tabellen så blir det (avrundas till) 6.
Om jag i Query Analysern enbart skriver:
<code>
SELECT Distinct dbo.Company.CompanyName,dbo.Employee.Department, dbo.Employee.EmployeeName, - + dbo.Employee.WorkTimeWeek/7 FROM Employee INNER JOIN
dbo.Company ON dbo.Employee.CompanyNr = dbo.Company.CompanyNr Where dbo.Employee.Department = @department And dbo.Employee.PersonalKategory = '01'
</code>
Så får jag inte 6 utan 5,71.Sv: Avrundar Cursor värden automatisk?
Det är som Martin skriver, du får en implicit konvertering till integer i din kod. Du skall skriva så här istället:
<code>
SELECT Distinct dbo.Company.CompanyName,dbo.Employee.Department, dbo.Employee.EmployeeName, - + dbo.Employee.WorkTimeWeek/7.0 FROM Employee INNER JOIN
dbo.Company ON dbo.Employee.CompanyNr = dbo.Company.CompanyNr Where dbo.Employee.Department = @department And dbo.Employee.PersonalKategory = '01'
</code>
Genom att ange 7.0 istället för 7 så talar du om att du jobbar med decimaltal och inte heltal. Sedan kan man alltid vara ännu tydligare genom att använda CAST eller CONVERT (kolla gärna MSDN / T-SQL hjälpen för dessa).
Mvh,
JohanSv:Avrundar Cursor värden automatisk?
Kanske skall tillägga att det tidigare inte returnerade 6 utan 6.0000. Både kolumnen som värdet hämtas från "- + dbo.Employee.WorkTimeWeek/7" och kolumnen som det läggs in i "insert into normdate values (@kat, @underkat, @Ftg, @Dep,@EmpName , @lonetyp, @normstartdate, <b>@Nt</b>) " är av typen numeric (5). Även variabeln som värdet sparas i mellan förflyttningen "DECLARE @Nt numeric(5)" är deklererad som en numeric (5) så det borde ju då inte vara fel här..
Det verkar ju som om den gör en implicit avrundning från 5,71xxx till 6.0000.
[Edit - La till nedanstående]
Läste i TSQL hjälpen att när ett numeriskt värde hämtas och sätts in i en kolumn för numerska värden så kan data "tappas" om man inte gör en explicit typomvandling, dvs använder CAST eller Convert. Detta precis som ni skrev. Har försökt använda CAST och CONVERT utan resultat. Kan någon visa hur det skall se ut?
Detta testade jag:
<code>
- + CAST(dbo.Employee.WorkTimeWeek/7 as Numeric)
'och detta
- + CAST(dbo.Employee.WorkTimeWeek as Numeric)/7
'och detta
- + CONVERT(Numeric (5),dbo.Employee.WorkTimeWeek/7)
'och detta
- + CONVERT(Numeric (5),dbo.Employee.WorkTimeWeek)/7
</code>Sv: Avrundar Cursor värden automatisk?
Testa:
<b>- + CAST( dbo.Employee.WorkTimeWeek/7 as Numeric( 5,2 ) )</b>
Femman anger det totala antalet siffror i talet. ( t.ex 532,23 )
Tvåan anget hur många decimaler du vill ha, av det totala antalet siffror
Du får testa dig fram till det som passar dig.
EDIT: Gäller alla ställen där du deklarerar numeric.
Skriver du bara numeric(5), kan det bli klent med decimaler.
//HåkanSv:Avrundar Cursor värden automatisk?