【问题标题】:Convert column from varchar to datetime and update it in the table将列从 varchar 转换为 datetime 并在表中更新
【发布时间】:2019-07-26 09:31:24
【问题描述】:

我有一个关于将 varchar 转换为 datetime 的问题。 该主题已在线程中涵盖 SQL Server Convert Varchar to Datetime 但我想更进一步。

我已经在VARCHAR(255) 的预定义表中执行了BULK INSERT 是目的地。我有一张表dbo.USR_02_ALL_RAW 和字段GLTGB 保存以下格式的字符串:07/16/2016

我可以通过以下代码将其转换为单个字符串:

DECLARE @Date varchar(255)
set @Date= '07/16/2016'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,4,2))

它给了我一个结果:

2016-07-16 00:00:00.000

但是我想将表格中的整个字段 GLTGB 传递给代码 dbo.USR_02_ALL_RAW,将其从VARCHAR 转换为DATETIME 并使用这些结果更新字段GLTGB。(将整个字段从varchar 转换为datetime

谢谢!

【问题讨论】:

  • datetime 存储到varchar 列不会将值存储为datetime(它将存储varchar)您需要使用定义为@987654339 的列@存储datetime

标签: sql sql-server


【解决方案1】:

首先清除这个,你要Bulk insertBulk update。由于您已经有一个列GLTGB。如果您只想更新值。

   update tab set GLTGB  =  
   CONVERT(datetime,RIGHT(GLTGB,4)+LEFT(GLTGB,2)+SUBSTRING(GLTGB,4,2))

或者

如果要将字段从 varchar 更新为 datetime。然后过程有点长。

   Alter table tab add newcol datetime     --- Add new datetime type column
   update tab set newcol =  
   CONVERT(datetime,RIGHT(GLTGB,4)+LEFT(GLTGB,2)+SUBSTRING(GLTGB,4,2))   --- update value in new column
   Alter table tab drop column GLTGB    --- drop GLGTB column
   Alter table tab add GLGTB datetime    --- add GLGTB column as datetime type
   update tab set GLGTB = newcol        --- update value from GLGTB from newcol
   Alter table tab drop column newcol   ---- remove unnecessary newcol

【讨论】:

  • 但如果 GLTGB 仍然是 varchar 列,那么 SQL 只需将值再次转换回 varchar 以便将其存储在列中。所以你的第一个代码 sn-p 根本没有任何用处,不知道你为什么建议它?
【解决方案2】:

如果您将一个值转换为日期时间,然后用该值更新它来自的同一数据库列,因为该列仍然是varchar,SQL 将不得不再次将该值转换回 varchar 以便存储它.所以你不能用这种简单的方法获得任何有用的东西。

如果你想真正改变列的数据类型,同时也转换所有的值,那么我认为你需要经过以下过程:

1) 在您的表中创建一个新的varchar 列(这将是临时的)

2) 将 GLTGB 列中的所有数据值复制到新列中(使用 UPDATE 语句)

3) 删除GLTGB

4) 使用相同的名称但使用 datetime 类型重新创建它

5) 使用 UPDATE 语句从临时列中重新填充新的 GLTGB

6) 最后,删除临时列

可能有更简单的方法,但这似乎是显而易见的过程。

【讨论】:

    【解决方案3】:

    您可以使用以下代码进行更新,但在此之前,you need to change the data type of your field to DateTime

    update dbo.USR_02_ALL_RAW 
       set GLTGB=cast(CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,4,2)) as datetime)
    

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2020-05-22
      相关资源
      最近更新 更多