Ошибка при попытке выполнить преобразование из типа данных bigint в дату - PullRequest
1 голос
/ 27 апреля 2019

Я изменил таблицу в своей базе данных, чтобы добавить новый столбец LogDate:

ALTER TABLE AccountsTable
ADD LogDate bigint NOT NULL DEFAULT(0)
GO

Теперь у меня есть результаты в этом новом столбце LogDate, которые выглядят как 1556366669.

После этого я попытался изменить процедуру входа в систему и добавил следующий код:

UPDATE [dbo].[AccountsTable] 
SET LogDate = DATEDIFF(s, '19700101', GETDATE()) 
WHERE AccID = @id

UPDATE [dbo].[AccountsTable]
SET ConsecutiveDays = 
    CASE 
       WHEN CAST(LogDate as Date) = CAST(DATEADD(DAY, -1, GETDATE()) AS DATE) 
                 AND ConsecutiveDays < 3 
          THEN ConsecutiveDays + 1 
       WHEN CAST(LogDate as Date) = CAST(GETDATE() AS DATE) 
          THEN ConsecutiveDays 
       ELSE 1 
    END,
    ChallengesCompleted = 
        CASE 
           WHEN ConsecutiveDays = 3
                AND CAST(LogDate AS DATE) = CAST(DATEADD(DAY, -1, GETDATE()) AS DATE)
              THEN ChallengesCompleted + 1
           ELSE ChallengesCompleted
        END,
    LogDate = GETDATE()
WHERE 
    AccID = @id

И я получаю следующую ошибку, пытаясь изменить процедуру входа в систему с кодом выше:

Явное преобразование из типа данных bigint в date не допускается.

Любая помощь приветствуется тем, что я могу сделать, чтобы решить эту проблему. Я использую SQL Server 2008.

1 Ответ

1 голос
/ 27 апреля 2019

Попытка выяснить проблему

Основная проблема заключается в том, что вы пытаетесь привести значение 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 вы можете увидеть, какие типы данных могут быть преобразованы при каждом подходе:

enter image description here

Ссылка


Обновление - исправление кода логики

Основываясь на ваших комментариях, я думаю, что вы ищете следующую логику:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...