我想做以下事情:
update AutoTagUse set TimeActive = (TimeActive + @OrigTimeActive) where AutoTagUseId = @AutoTagUseId
其中TimeActive
是SQL Server中的TIME(0)
列,而OrigTimeActive
是TimeSpan
变量(在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)
答案 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
作为此处的列。