【问题标题】:How do I change a column data type from varchar(255) to date?如何将列数据类型从 varchar(255) 更改为 date?
【发布时间】:2018-06-03 22:50:00
【问题描述】:

我在 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 Server 版本?请运行SELECT @@VERSION 并分享结果。
  • 所有答案都会根据你的表的大小有效地工作,如果行数很大,你会遇到日志扩展问题

标签: sql sql-server


【解决方案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。

在您做任何事情之前,请确保所有使用此列的应用程序和代码都可以处理这些更改。

备注

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您想更改列的数据类型(并且应该),那么您需要使用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
      

      【讨论】:

        【解决方案4】:

        这样做的正确方法是;

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

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

        【讨论】:

          【解决方案5】:

          试试这个:

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

          【讨论】:

            猜你喜欢
            • 2014-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-17
            • 1970-01-01
            • 1970-01-01
            • 2011-02-05
            • 1970-01-01
            相关资源
            最近更新 更多