如何将TimeSpan添加到SQL Server中的时间列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将TimeSpan添加到SQL Server中的时间列相关的知识,希望对你有一定的参考价值。
我想做类似以下的事情:
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数据提供程序
堆栈跟踪: 在Dapper.SqlMapper.ExecuteScalarImpl [T](IDbConnection cnn,CommandDefinition&command) 在Dapper.SqlMapper.ExecuteScalar(IDbConnection cnn,String sql,Object param,IDbTransaction transaction,Nullable
1 commandTimeout, Nullable
1 commandType) 在C: git Store LicenseLibrary DataObjects AutoTagUse.cs中的LicenseLibrary.DataObjects.AutoTagUse.Update(IDbConnection conn,IDbTransaction事务):第171行 在C: git Store TestLibrary DataObjects TestAutoTagUse.cs中的TestLibrary.DataObjects.TestAutoTagUse。<> c.b__2_0(IDbConnection conn):第59行 在LicenseLibrary.Database.AzureDataAccess。<> c__DisplayClass11_0.b__0()在C: git Store LicenseLibrary Database AzureDataAccess.cs:第104行 在Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy。<> c__DisplayClass1.b__0() 在Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.ExecuteAction [TResult](Func`1 func)
作为时间(0),我假设你的间隔是秒
你可以使用DATEADD()
例
Update AutoTagUse
set TimeActive = dateadd(SECOND,@OrigTimeActive,TimeActive)
Where AutoTagUseId = @AutoTagUseId
通常,如果您想要存储时间跨度,则SQL Server中的time
数据类型不适合。因为它专为存储一天中的时间而设计,而不是时间跨度。这意味着不支持将这些值中的两个加在一起(将4pm和8pm加在一起没有意义)。它也不支持超过24小时的负值或值。
由于所有这些原因,我通常建议使用数字数据类型,并在其预期单位的名称中给出明确的指示。 (我通常更喜欢所需的最小粒度的int
类型,其他人可能选择使用某种类型的decimal
)
例如。我在这里使用SecondsActive int
作为专栏。
以上是关于如何将TimeSpan添加到SQL Server中的时间列的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 LINQ 将 TimeSpan 计算转换为 SQL
SQL Server - 如何将带有组小计的列添加到查询结果中