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

时间:2017-12-21 09:34:07

标签: sql sql-server

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

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

这些是我得到的错误。

  

Msg 911,Level 16,State 1,Line 1       数据库'dbo'不存在。确保正确输入名称。

     

Msg 241,Level 16,State 1,Line 3       从字符串转换日期和/或时间时转换失败。

我该如何调整脚本?

5 个答案:

答案 0 :(得分:4)

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

USE

您的第二条错误消息是因为USE [reporting] GO 是字符串常量,而不是列名。

select语句应为

'report_date'

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

基本上我建议首先确保SELECT CAST(report_date as date) -- Don't use Convert without the style argument.... FROM [dbo].[marketing] 语句完成,没有任何例外,然后才改变表格:

select

答案 1 :(得分: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

答案 2 :(得分:1)

这样做的正确方法就像;

ALTER TABLE reportin.dbo.marketing ALTER COLUMN'report_date'date

您可以查看此How do you change the datatype of a column in MS SQL?

答案 3 :(得分:1)

"转换"用于在select查询中从一种数据类型转换为另一种数据类型,您需要使用alter语句来更改数据库列 USE [databasename]就足够了,所以在这里重写你的查询:

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

答案 4 :(得分:1)

缓慢但安全的方法是:

  1. 创建新列(ALTER TABLE dbo.MyTable ADD MyNewColumn DATE NULL;
  2. 使用旧列(UPDATE dbo.MyTable SET MyNewColumn = CONVERT(DATE, MyColumn);
  3. 更新新列
  4. 删除旧列(ALTER TABLE dbo.MyTable DROP MyColumn;) - 或者,您可以重命名此列并保持原样)
  5. 重命名新列(EXEC sp_rename 'dbo.MyTable.MyNewColumn', 'MyColumn', 'COLUMN';
  6. 您可能必须事先删除索引,但此方法(以及它的更改)有助于防止数据丢失。

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

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

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

    备注

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