SQL Server datediff 和十进制舍入到偶数

mlg*_*g74 1 sql vb.net sql-server-2012

我正在使用datediff获取 2 组或更多组日期之间的差值总和,aDateStart并且aDateEnd. 结果应该是 7.75,但问题是它四舍五入到 7.00 并Decimal(9,2)在除以 60 部分后将其存储在数据库列中。如果我从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
Run Code Online (Sandbox Code Playgroud)

存储过程的相关部分:

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
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

jmc*_*ney 5

您大概在那里执行整数除法。您可能需要将至少一个(可能两个)值转换为类型decimal才能获得decimal结果。

CONVERT(decimal(9,2), DATEDIFF(MINUTE, aStartDate, aEndDate)) / CONVERT(decimal(9,2), 60)
Run Code Online (Sandbox Code Playgroud)

  • 如果您不想执行额外的“convert()”,只需除以“60.0” (8认同)