【问题标题】:SQL Server datediff and decimal rounding to even numberSQL Server datediff 和小数舍入到偶数
【发布时间】:2021-08-08 08:29:37
【问题描述】:

我正在使用 datediff 来获取 2 组或更多组日期之间的差异总和,aDateStartaDateEnd。结果应该是 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

存储过程的相关部分:

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

【问题讨论】:

  • 我不禁想知道为什么您还想将 VB.NET 代码标记为 C#?您的问题是在 VB.NET 中检索结果还是 SQL 查询本身?
  • 使用 C# 的人比使用 VB 的人多,而且代码基本相同,因此 C# 的人可以像 VB 一样轻松地提供帮助。我不知道问题出在VB代码还是SQL代码中,但是存储在数据库中的值是这里的问题。
  • 标签的主要用途是向我们提供有关您的问题的信息。您不应该添加不相关的标签来“获得更多关注”您的问题。在你的情况下这并不严重,所以我没有投反对票,但更极端的情况会立即从我和 - 我认为 - 从其他人那里获得投反对票。
  • 点了,谢谢

标签: sql vb.net sql-server-2012


【解决方案1】:

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

CONVERT(decimal(9,2), DATEDIFF(MINUTE, aStartDate, aEndDate)) / CONVERT(decimal(9,2), 60)

【讨论】:

  • 做到了。我拒绝使用额外的代码(转换),因为我认为它应该在不转换的情况下工作,但我当然错了。谢谢!
  • 只除以60.0,如果你不想做额外的convert()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多