如何将列数据类型从varchar(255)更改为日期?

问题描述 投票:1回答:5

我正在使用一个报告数据库,该数据库由SQL Server上的20个表组成。在市场营销表中,我有一个report_date列,目前是varchar(255)。它基本上是一个2017-12-12格式的日期。我想将此列的类型更改为日期。我正在运行此脚本,但收到错误。脚本如下:

USE [reporting].[dbo].[marketing]
GO
SELECT CONVERT(date, 'report_date');

这些是我得到的错误。

消息911,级别16,状态1,行1数据库'dbo'不存在。确保正确输入名称。

消息241,级别16,状态1,行3转换在从字符串转换日期和/或时间时失败。

我该如何调整脚本?

sql sql-server
5个回答
4
投票

如果要更改列的数据类型(并且应该),则需要使用alter table语句。您的第一条错误消息是因为USE指令 - 它应该是

USE [reporting]
GO

您的第二条错误消息是因为'report_date'是字符串常量,而不是列名。

select语句应该是

SELECT CAST(report_date as date)  -- Don't use Convert without the style argument....
FROM [dbo].[marketing]

请注意,如果您有一个无法转换为日期的值,则会再次出现第二个错误。

基本上我建议首先确保select语句完成没有任何异常,然后才改变表:

USE reporting
GO

ALTER TABLE [dbo].[marketing] 
     ALTER COLUMN report_date DATE
GO

1
投票

试试这个:

SELECT CONVERT(DATE, report_date) --If only for comparison
ALTER TABLE marketing ALTER COLUMN report_date DATE --If want to change in the table

1
投票

正确的方法是这样的;

ALTER TABLE reportin.dbo.marketing ALTER COLUMN'report_date'日期

你可以查看这个How do you change the datatype of a column in MS SQL?


1
投票

“转换”用于在选择查询中从一种数据类型转换为另一种数据类型,您需要使用alter语句来更改数据库列,并且USE [databasename]就足够了,因此请在此处重写您的查询:

USE [reporting]
GO
ALTER TABLE marketing ALTER COLUMN ReportDate DATE

1
投票

缓慢但安全的方法是:

  1. 创建一个新列(ALTER TABLE dbo.MyTable ADD MyNewColumn DATE NULL;
  2. 使用旧列更新新列(UPDATE dbo.MyTable SET MyNewColumn = CONVERT(DATE, MyColumn);
  3. 删除旧列(ALTER TABLE dbo.MyTable DROP MyColumn;) - 或者,您可以重命名此列并保持原样)
  4. 重命名新列(EXEC sp_rename 'dbo.MyTable.MyNewColumn', 'MyColumn', 'COLUMN';

您可能必须事先删除索引,但此方法(以及它的更改)有助于防止数据丢失。

如果在转换期间遇到错误,则应从更新中删除这些值(例如,添加WHERE子句)并手动调查它们。

如果您使用的是SQL Server 2012或更高版本,则可以使用TRY_CONVERT()忽略无法转换为DATE的值。在这种情况下,新列中将包含NULL。

在执行任何操作之前,请确保使用此列的所有应用程序和代码都可以处理更改。

笔记

您可能希望在更改此类之后重建表/索引。

© www.soinside.com 2019 - 2024. All rights reserved.