【问题标题】:SQL Server : change strings in multiple rowsSQL Server:更改多行中的字符串
【发布时间】:2012-12-13 07:24:07
【问题描述】:

我的表中有大约 200 万行,其中有一列日期...此列的类型为 VARCHAR,它包含错误的日期格式,我们的格式为 dd/mm/YYYY,它必须是 @987654324 @...

我怎样才能改变它?请记住,它是 Varchar 列,而不是 Datetime 列(它不能是日期时间字段,因为我们使用查询对其进行操作)

谢谢你的建议。

更新

正如我所说,我有数百万行,因此无法将日期字段逐一查询到新字段,正如您在回复中所说的那样......我需要某种“自动”模式来将每一行转移到它的新格式和数据类型列。

【问题讨论】:

  • 它包含错误的日期格式 - - 这是错误的数据类型 - 句点。您还可以操作DATETIME 列 - 完全没有问题 - 这不是使用错误数据类型的有效借口...阅读(并拥抱!)阅读@987654321 @ - 你应该始终使用最合适的数据类型 - 毕竟这就是它们的用途!
  • 我知道...但是我从 MySQL 进行了导入,当我尝试移动该字段时它给我带来了错误,所以我更改为 varchar 以使其正常工作,但是当我们犯了一个错误时导入值,所以日期格式错误......所以如果我可以更改格式,我想我可以更改数据类型

标签: sql-server date format


【解决方案1】:

如果您的最终目标只是清理以在日期时间列中结束,您只需添加一个新列,然后传输数据:

update tbl
   set new_datetime_col = convert(datetime, dateinvarchar, 103);

查询

update tbl
   set dateinvarchar = convert(char(10),
                       convert(datetime,
                               dateinvarchar, 103), 121)
select * from tbl

示例表

create table tbl (dateinvarchar varchar(10));
insert tbl values
  ('01/02/2012'),
  ('02/02/2012'),
  ('03/02/2012'),
  ('14/12/2012');

Sample Result

| DATEINVARCHAR |
-----------------
|    2012-02-01 |
|    2012-02-02 |
|    2012-02-03 |
|    2012-12-14 |

【讨论】:

  • Update 语句适用于多行,或者在没有 WHERE 子句的情况下适用于整个表,如图所示。无论是一行还是一百万,同一个语句都会处理整个表。
  • 感谢它的工作,更新到新格式后,我已将数据类型更改为“日期”:) 谢谢!
【解决方案2】:

试试这个

Declare @t table (dt varchar(25));
insert into @t
SELECT '01/01/2012' UNION 
SELECT '02/01/2012' UNION
SELECT '03/01/2012'

SELECT convert(varchar(10), CONVERT(datetime, dt, 103), 120) as dt_new
from @t;


CREATE TABLE newT(id, dt varchar(10));
INSERT INTO newT
SELECT id, convert(varchar(10), CONVERT(datetime, dt, 103), 120) as dt_new
    from oldT;

【讨论】:

  • @user1381537 检查我更新的答案,我不确定你为什么认为我的查询只处理几行而不是全部来自表?它将转换所有行的 dt 列。我使用示例数据来展示如何做到这一点。您需要将 @t 替换为原始表格
  • 我认为因为我看到了 3 个 SELECT 语句...按照您解释的方式,我必须创建一个新表...但是如果我只想使用同一个表,但移动“date_field " 到 "newdate_field" 在同一个表中?
  • 好的,我设法做到了,但是....而是将新值插入到新字段中,在同一个 IDS 上...它添加了新行,所以我得到了 160 万行,所有内容为NULL 但新日期 T_T 插入 Banksphere (ficha) SELECT convert(varchar(10), CONVERT(date, fecha, 103), 120) as dt_new from Banksphere
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2015-09-16
  • 2020-10-26
相关资源
最近更新 更多