Как добавить TimeSpan к столбцу времени в SQL Server - PullRequest
0 голосов
/ 16 сентября 2018

Я хочу сделать что-то вроде следующего:

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

Где TimeActive - это столбец TIME(0) в SQL Server, а 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
Сообщение = Время типа данных аргумента недопустимо для аргумента 2 функции dateadd.
Source = .Net Поставщик данных SqlClient

StackTrace:
в Dapper.SqlMapper.ExecuteScalarImpl [T] (IDbConnection cnn, CommandDefinition & command)
в Dapper.SqlMapper.ExecuteScalar (IDbConnection cnn, String sql, Параметр объекта, IDbTransaction транзакция, Nullable 1 commandTimeout, Nullable 1 commandType)
в LicenseLibrary.DataObateUb.сonn, транзакция IDbTransaction) в C: \ git \ Store \ LicenseLibrary \ DataObjects \ AutoTagUse.cs: строка 171
в TestLibrary.DataObjects.TestAutoTagUse. <> c.b__2_0 (IDbConnection conn) в C: \ git \ Store \TestLibrary \ DataObjects \ TestAutoTagUse.cs: строка 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] (1035) 10)

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Как правило, если вы хотите сохранить время span , тип данных time в SQL Server не подходит. Потому что он предназначен для хранения времени дня , а не промежутков времени. Это означает, что нет никакой поддержки для добавления двух из этих значений вместе (нет смысла добавлять 4 вечера и 8 вечера вместе). Он также не поддерживает отрицательные значения или значения, превышающие 24 часа.

По всем этим причинам я обычно рекомендую вместо этого использовать числовой тип данных с четким указанием в названии предполагаемых единиц. (Я обычно предпочитаю тип int с наименьшей необходимой гранулярностью, другие могут выбрать decimal некоторого вида)

например. Я бы использовал SecondsActive int в качестве столбца здесь.

0 голосов
/ 16 сентября 2018

Будучи временем (0), я предполагаю, что ваш интервал составляет SECONDS

Вы можете использовать DATEADD ()

Пример

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