我试图更新SQL中的列,所以我尝试使用它:
update [BaseHistorica_]
set Cierre=CONVERT(datetime2,cierre,103)
但是出现以下错误消息:
Msg 241, Level 16, State 1, Line 15
Conversion failed when converting date and/or time from character string.
然后我尝试了这个查询,结果是我期待
SELECT top 1000 [ID]
,convert(datetime2,[Cierre],103) as cierre
,[Seg1]
,[Mora1]
,[Saldo_T]
,[Saldo_FD]
,[Seg2]
,[Mora2]
FROM [TARSHOP].[dbo].[BaseHistorica_]
最后我尝试使用相同的错误消息创建了一个我想要的表。
SELECT top 1000 [ID]
,convert(datetime2,[Cierre],103) as cierre
,[Seg1]
,[Mora1]
,[Saldo_T]
,[Saldo_FD]
,[Seg2]
,[Mora2]
into [BaseHistoricaF]
FROM [T].[dbo].[BaseHistorica_]
为什么会发生?如何更新此列或使用此列创建表。
答案 0 :(得分:0)
列Cierre是一种字符串格式,例如varchar或nvarcher。更新BaseHistorica_时,您尝试将cierre转换为datetime2并将其存储在Cierre列中,这是一个字符串。您必须在Cierre中找出字符串的格式并符合该标准。
将日期保存为varchars时出现问题。一个是其他人可以用不同的格式输入日期。例如,'01 / 08/2014'并且您输入日期为'01 -08-2014'。它们是完全不同的价值观,因为它们是字符串,而不是日期。最好的办法是将日期列格式化为日期,在您的情况下为datetime2,然后在查询数据时格式化日期。当您的值为日期时,您可以使用各种SQL函数,例如日期范围(BETWEEN '01 / 01/2012'和'01 / 01/2013')和DATEDIFF。因此,经验法则是存储日期并仅格式化输出。
答案 1 :(得分:0)
根据您的说明,问题可能是因为您尝试将DATETIME
存储在仅包含STRING
(或CHAR
)值的列中。
发生的是,Cierre
列是STRING
数据类型。当您执行CONVERT(datetime2,cierre,103)
时,它已将值转换为DATETIME
,然后您希望将它们存储回仅保留STRING
的列
我认为你需要做的是,你必须创建一个DATETIME
数据类型的临时列,然后将该列转换并复制到这个新的临时列。
答案 2 :(得分:0)
错误消息告诉我们尝试转换为datetime2失败"来自字符串&#34 ;;因此[Cierre]似乎已成为一个字符串。
stored
值符合的格式,可能(如果幸运的话)YYYYMMDD或YYYY-MM-DD 如果将日期/时间信息存储为字符串,则
简单地存储日期/时间信息,因为字符串很糟糕,会使SQL世界变得更加困难。