在SQL中转换日期

时间:2014-08-14 19:05:15

标签: sql sql-server string sql-update converter

我试图更新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_]

为什么会发生?如何更新此列或使用此列创建表。

3 个答案:

答案 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]似乎已成为一个字符串。

  1. 了解[Cierre]的实际数据类型(可能是varchar或nvarchar)
  2. 然后了解stored值符合的格式,可能(如果幸运的话)YYYYMMDD或YYYY-MM-DD
  3. 不要将它们设置为不同的格式,&绝对不是103(DD / MM / YYYY)
  4. 仅使用convert(varchar,[Cierre],103)输出!
  5. 如果将日期/时间信息存储为字符串,则

    • 您只需了解值的存储方式,
    • 您被拒绝简单访问许多日期/时间功能

    简单地存储日期/时间信息,因为字符串很糟糕,会使SQL世界变得更加困难。