【问题标题】:An error trying to do a conversion from data type bigint to date尝试将数据类型 bigint 转换为 date 时出错
【发布时间】:2019-09-16 22:47:27
【问题描述】:

我已更改数据库中的一个表以添加一个新列 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。

【问题讨论】:

  • 查看答案更新,以及我们昨天开始的讨论(聊天)

标签: sql sql-server tsql sql-server-2008 stored-procedures


【解决方案1】:

试图找出问题

主要问题是您试图将 bigint 值强制转换为不允许的日期。

CAST(LogDate as Date)

将抛出以下表达式:

不允许从数据类型 bigint 到 date 的显式转换。

即使整数采用以下格式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 中,您可以看到每种方法可以转换哪些数据类型:

参考


更新 - 修复代码逻辑

根据您的 cmets,我认为您正在寻找以下逻辑:

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

【讨论】:

猜你喜欢
  • 2012-09-25
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多