Попытка выяснить проблему
Основная проблема заключается в том, что вы пытаетесь привести значение bigint к дате, которая недопустима.
CAST(LogDate as Date)
сгенерирует следующее выражение:
Явное преобразование из типа данных bigint в дату не допускается.
Даже если целое число имеет следующий формат yyyyMMdd
например: 19700101
Если целое значение имеет следующий формат yyyyMMdd
, вы можете преобразовать строку ot в дату
CAST(CAST(LogDate as varchar(25)) as Date)
Иначе вы должны реализовать свою собственную логику. Например, если столбец содержит вторую разницу с 1970-01-01
, вы можете использовать:
DATEADD(s, [LogDate], '19700101')
Кроме того, используя следующее выражение
[LogDate] = GetDATE()
вызовет следующее исключение:
Неявное преобразование из типа данных datetime в bigint не допускается. Используйте функцию CONVERT для выполнения этого запроса.
Вы должны изменить его на
[LogDate] = DATEDIFF(s, '19700101', GETDATE())
ИЛИ
[LogDate] = CAST(GETDATE() as BIGINT)
Он основан на ваших потребностях
Тип конверсии даты
Из следующей таблицы Microsoft Grid вы можете увидеть, какие типы данных могут быть преобразованы при каждом подходе:
Ссылка
Обновление - исправление кода логики
Основываясь на ваших комментариях, я думаю, что вы ищете следующую логику:
UPDATE [dbo].[AccountsTable]
SET LogDate = DATEDIFF(s, '19700101', GETDATE())
WHERE AccID = @id AND LogDate IS NULL
UPDATE [dbo].[AccountsTable]
SET ConsecutiveDays =
CASE
WHEN ConsecutiveDays > 3
THEN 1
WHEN CAST(DATEADD(s, [LogDate], '19700101') AS DATE) < CAST(DATEADD(d,(-1 * [ConsecutiveDays]),GETDATE()) AS DATE)
THEN 1
WHEN CAST(DATEADD(s, [LogDate], '19700101') AS DATE) < CAST(GETDATE() AS DATE)
THEN ConsecutiveDays + 1
ELSE ConsecutiveDays
END,
ChallengesCompleted =
CASE
WHEN ConsecutiveDays = 3
THEN ChallengesCompleted + 1
ELSE ChallengesCompleted
END,
LogDate = DATEDIFF(s, '19700101', GETDATE())
WHERE
AccID = @id
Обновление 2 - на основе обсуждения в чате
Попробуйте использовать следующий код:
UPDATE [dbo].[AccountsTable]
SET LogDate = DATEDIFF(s, '19700101', GETDATE())
WHERE AccID = @id AND LogDate IS NULL
UPDATE [dbo].[AccountsTable]
SET ConsecutiveDays =
CASE
WHEN ConsecutiveDays >= 3
THEN 1
WHEN CAST(DATEADD(s, [LogDate], '19700101') AS DATE) < CAST(DATEADD(d,(-1 * [ConsecutiveDays]),GETDATE()) AS DATE)
THEN 1
WHEN CAST(DATEADD(s, [LogDate], '19700101') AS DATE) < CAST(GETDATE() AS DATE)
THEN ConsecutiveDays + 1
ELSE ConsecutiveDays
END,
ChallengesCompleted =
CASE
WHEN ConsecutiveDays = 2
AND CAST(DATEADD(s, [LogDate], '19700101') AS DATE) = CAST(DATEADD(d,(-1 * [ConsecutiveDays]),GETDATE()) AS DATE)
THEN ChallengesCompleted + 1
ELSE ChallengesCompleted
END,
LogDate = DATEDIFF(s, '19700101', GETDATE())
WHERE
AccID = @id