Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 尝试将数据类型bigint转换为date时出错_Sql_Sql Server_Tsql_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 尝试将数据类型bigint转换为date时出错

Sql 尝试将数据类型bigint转换为date时出错,sql,sql-server,tsql,sql-server-2008,stored-procedures,Sql,Sql Server,Tsql,Sql Server 2008,Stored Procedures,我修改了数据库中的一个表,添加了一个新列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

我修改了数据库中的一个表,添加了一个新列
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
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
更新[dbo].[AccountsTable]
设置LogDate=DATEDIFF(s'19700101',GETDATE())
其中AccID=@id
更新[dbo].[AccountsTable]
设置连续天数=
案例
当强制转换(LogDate为日期)=强制转换(DATEADD(DAY,-1,GETDATE())为日期)
并且连续的天数小于3天
然后连续几天+1
当强制转换(LogDate为日期)=强制转换(GETDATE()为日期)
然后连续几天
其他1
完,,
挑战已完成=
案例
当连续天数=3时
AND CAST(LogDate作为日期)=CAST(DATEADD(DAY,-1,GETDATE())作为日期)
然后挑战者完成+1
否则挑战就完成了
完,,
LogDate=GETDATE()
哪里
AccID=@id
使用上述代码更改登录过程时,我会遇到以下错误:

不允许将数据类型bigint显式转换为date

CAST(LogDate as Date)
对于我能做些什么来解决这个问题,我们非常感谢您的帮助。我正在使用SQL Server 2008。

试图找出问题所在 主要问题是,您试图将bigint值强制转换为不允许的日期

CAST(LogDate as Date)
将抛出以下表达式:

不允许将数据类型bigint显式转换为date

CAST(LogDate as Date)
即使整数采用以下格式
yyyyMMdd
ex:
19700101

如果整数值采用以下格式
yyyyymmdd
,则可以将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()) 

这是基于你的需要


日期类型转换 从以下Microsoft网格中,您可以看到每种方法都可以转换哪些数据类型:

参考


更新-修复代码逻辑 根据你的评论,我认为你在寻找以下逻辑:

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
更新[dbo].[AccountsTable]
设置LogDate=DATEDIFF(s'19700101',GETDATE())
其中AccID=@id和LogDate为空
更新[dbo].[AccountsTable]
设置连续天数=
案例
当连续天数>3天时
那么1
当将日期添加(s,[LogDate],'19700101')作为日期进行转换时
那么1
当强制转换(日期添加(s,[LogDate],'19700101')作为日期)

更新2-基于聊天讨论 请尝试使用以下代码:

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
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
更新[dbo].[AccountsTable]
设置LogDate=DATEDIFF(s'19700101',GETDATE())
其中AccID=@id和LogDate为空
更新[dbo].[AccountsTable]
设置连续天数=
案例
当连续天数>=3时
那么1
当将日期添加(s,[LogDate],'19700101')作为日期进行转换时
那么1
当强制转换(日期添加(s,[LogDate],'19700101')作为日期)
评论不用于扩展讨论;此对话已结束。请检查答案更新和我们昨天开始的讨论(聊天)