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')作为日期)
评论不用于扩展讨论;此对话已结束。请检查答案更新和我们昨天开始的讨论(聊天)