如何将TimeSpan添加到SQL Server中的时间列

时间:2018-09-15 23:16:58

标签: sql-server ado.net timespan

我想做以下事情:

update AutoTagUse set TimeActive = (TimeActive + @OrigTimeActive) where AutoTagUseId = @AutoTagUseId

其中TimeActive是SQL Server中的TIME(0)列,而OrigTimeActiveTimeSpan变量(在C#中)。

我正在尝试这样做,因此我可以让多个服务同时更新数据库中的此值,而不必通过事务锁定事物。

用于创建列的SQL Server条目为:

[TimeActive] TIME (0)       
    CONSTRAINT [DF_AutoTagUse_TimeActive] DEFAULT ('00:00:00') NOT NULL,

我现在正在尝试的是:

TimeSpan difference = TimeActive - origTimeActive;
conn.ExecuteScalar("update AutoTagUse set TimeActive = dateadd(SECOND, @OrigTimeActive, TimeActive) where AutoTagUseId = @AutoTagUseId", 
                        new { AutoTagUseId = AutoTagUseId, OrigTimeActive = difference }, transaction);

我得到了:

  

System.Data.SqlClient.SqlException
  HResult = 0x80131904
  Message =参数数据类型时间对于dateadd函数的参数2无效。
  Source = .Net SqlClient数据提供程序

     

StackTrace:
  在Dapper.SqlMapper.ExecuteScalarImpl [T](IDbConnection cnn,CommandDefinition&命令)
  在Dapper.SqlMapper.ExecuteScalar(IDbConnection cnn,字符串sql,对象参数,IDbTransaction事务,可空1 commandTimeout, Nullable 1 commandType)
  在C:\ git \ Store \ LicenseLibrary \ DataObjects \ AutoTagUse.cs:line 171中的LicenseLibrary.DataObjects.AutoTagUse.Update(IDbConnection conn,IDbTransaction transaction)处
  在TestLibrary.DataObjects.TestAutoTagUse处。<> c.b__2_0(IDbConnection conn)在C:\ git \ Store \ TestLibrary \ DataObjects \ TestAutoTagUse.cs:line 59
  在C:\ git \ Store \ LicenseLibrary \ Database \ AzureDataAccess.cs:line 104
中的LicenseLibrary.Database.AzureDataAccess。<> c__DisplayClass11_0.b__0()   在Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy中。<> c__DisplayClass1.b__0()
  在Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.ExecuteAction [TResult](Func`1 func)

2 个答案:

答案 0 :(得分:1)

时间为(0),我假设您的间隔为SECONDS

您可以使用 DATEADD()

示例

Update AutoTagUse 
   set TimeActive = dateadd(SECOND,@OrigTimeActive,TimeActive) 
 Where AutoTagUseId = @AutoTagUseId

答案 1 :(得分:1)

通常,如果要存储时间 span ,则SQL Server中的time数据类型不合适。因为它是为存储一天中的时间而设计的,所以不是时间跨度。这意味着不支持将这两个值加在一起(将4pm和8pm加在一起没有意义)。它也不支持负值或大于24小时的值。

由于所有这些原因,我通常建议使用数字数据类型,而不要在预期单位的名称中给出明确的指示。 (我通常更喜欢使用要求的最小粒度的int类型,其他人可能选择使用某种decimal

例如我将使用SecondsActive int作为此处的列。