SQL 服务器 datediff 和小数四舍五入到偶数
SQL Server datediff and decimal rounding to even number
我正在使用 datediff
来计算 2 组或多组日期 aDateStart
和 aDateEnd
之间的差异之和。结果应该是 7.75,但问题是它四舍五入为 7.00 并在除以 60 部分后将其存储在 Decimal(9,2)
数据库列中。如果我从 SQL 查询中去掉“/60”,结果是 465.00,这在几分钟内是正确的,但我希望数据库存储 7.75
我得到的秒数是正确的,但是当我除以 60 时,结果四舍五入为 7.00。
数据:
orderId AdminId aStartDate aEndDate
-----------------------------------------------------------------------
1 1 2021-04-02 08:00:00.000 2021-04-02 11:30:00.000
1 1 2021-04-02 08:00:00.000 2021-04-02 12:15:00.000
存储过程的相关部分:
ALTER PROCEDURE [dbo].[sp_updateManagerStatus]
@AdminId int,
@OrderId int,
@Id int,
@Count1 decimal(9,2) OUTPUT
SELECT
@Count1 = SUM(DATEDIFF(MINUTE, aStartDate, aEndDate) / 60)
FROM
Assignment
WHERE
OrderId = @OrderId AND AdminId = @AdminId
BEGIN
UPDATE JobSite
SET SiteActualTime = @Count1
WHERE Id = @Id AND AdminId = @AdminId
END
vb.net代码的相关部分:
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add(New SqlParameter("@AdminId", Variable.ToString()))
cmd.Parameters.Add(New SqlParameter("@OrderID", Request.QueryString("OrderNo")))
cmd.Parameters.Add(New SqlParameter("@Id", JobSiteIdlbl.Text))
Dim parameter As SqlParameter = New SqlParameter("@Count1", SqlDbType.Decimal)
parameter.IsNullable = True
parameter.Precision = 9
parameter.Scale = 2
parameter.Direction = ParameterDirection.Output
cmd.Parameters.Add(parameter)
con.Open()
rowsaffected = cmd.ExecuteNonQuery()
您大概是在那里执行整数除法。您可能需要将至少一个(可能是两个)值转换为类型 decimal
以获得 decimal
结果。
CONVERT(decimal(9,2), DATEDIFF(MINUTE, aStartDate, aEndDate)) / CONVERT(decimal(9,2), 60)
我正在使用 datediff
来计算 2 组或多组日期 aDateStart
和 aDateEnd
之间的差异之和。结果应该是 7.75,但问题是它四舍五入为 7.00 并在除以 60 部分后将其存储在 Decimal(9,2)
数据库列中。如果我从 SQL 查询中去掉“/60”,结果是 465.00,这在几分钟内是正确的,但我希望数据库存储 7.75
我得到的秒数是正确的,但是当我除以 60 时,结果四舍五入为 7.00。
数据:
orderId AdminId aStartDate aEndDate
-----------------------------------------------------------------------
1 1 2021-04-02 08:00:00.000 2021-04-02 11:30:00.000
1 1 2021-04-02 08:00:00.000 2021-04-02 12:15:00.000
存储过程的相关部分:
ALTER PROCEDURE [dbo].[sp_updateManagerStatus]
@AdminId int,
@OrderId int,
@Id int,
@Count1 decimal(9,2) OUTPUT
SELECT
@Count1 = SUM(DATEDIFF(MINUTE, aStartDate, aEndDate) / 60)
FROM
Assignment
WHERE
OrderId = @OrderId AND AdminId = @AdminId
BEGIN
UPDATE JobSite
SET SiteActualTime = @Count1
WHERE Id = @Id AND AdminId = @AdminId
END
vb.net代码的相关部分:
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add(New SqlParameter("@AdminId", Variable.ToString()))
cmd.Parameters.Add(New SqlParameter("@OrderID", Request.QueryString("OrderNo")))
cmd.Parameters.Add(New SqlParameter("@Id", JobSiteIdlbl.Text))
Dim parameter As SqlParameter = New SqlParameter("@Count1", SqlDbType.Decimal)
parameter.IsNullable = True
parameter.Precision = 9
parameter.Scale = 2
parameter.Direction = ParameterDirection.Output
cmd.Parameters.Add(parameter)
con.Open()
rowsaffected = cmd.ExecuteNonQuery()
您大概是在那里执行整数除法。您可能需要将至少一个(可能是两个)值转换为类型 decimal
以获得 decimal
结果。
CONVERT(decimal(9,2), DATEDIFF(MINUTE, aStartDate, aEndDate)) / CONVERT(decimal(9,2), 60)