【问题标题】:SQL server Data types - Date VS Varchar(n)SQL server 数据类型 - Date VS Varchar(n)
【发布时间】:2015-04-24 12:45:46
【问题描述】:

我开发了一个系统,将我的日期值存储在 Varchar(n) 列中。现在我被要求将列的数据类型更改为日期。 我的日期格式是 dd/mm/yyyy,并且我在包含此日期列的表中有 2000 多条记录,该列的类型为 varchar。在不影响现有数据的情况下,将列的数据类型从 varchar 更改为 Date 的最佳方法是什么?我想知道将日期值存储在 varchar 列中的缺点是什么,以及将日期值存储在 Varchar 数据类型中的优点是什么。非常感谢任何帮助。

【问题讨论】:

    标签: sql-server-2008 varchar sqldatatypes


    【解决方案1】:

    如果您可以保证您的列仅包含格式为 dd/mm/yyyy 的日期,并且在表 AlterColumnTest 上给定名为 DateColumnToChange 的列,则可以执行以下操作:

    SET DATEFORMAT dmy
    ALTER TABLE [AlterColumnTest]
    ALTER COLUMN DateColumnToChange DATETIME
    

    第一行将确保在您的脚本范围内,日期格式将设置为日-月-年。

    然后,alter 语句将尝试更改列的类型,但首先会尝试将当前值隐式转换为 DateTime。如果失败,您的列的类型将不会改变。如果所有值都可以转换为 DateTime,它会将列类型更改为 DateTime,并且其中的所有值现在都应该是 DateTime 类型。

    将日期和时间值存储为特定类型的原因与在强类型语言中我们指定特定变量类型的原因相同。在处理数据时,它为您提供了一层额外的安全保障。您的查询还知道您在其中持有什么样的数据,并将为此进行优化。它将使列和数据比较更容易,因为您可以利用内置比较,而无需显式转换(例如检查日期是否早于提供的日期)。

    我真的没有任何理由(但如果我错了,请在 cmets 中纠正我)不将 DateTime 值存储在 DateTime 类型列之外的任何其他内容中。

    【讨论】:

    • 感谢您的回答,我会尽快尝试并发布我的结果。
    • 我尝试了你的方法,我在 varchar 列中插入了 dd/mm/yyyy 格式的两个日期值,然后将列数据类型更改为日期(因为我不存储时间所以我使用了日期),它改变了列就好了,但是当我查询列时,我得到的日期是 yyyy-mm-dd 格式,所以不是我想要的。当我更改列的数据类型时,我不希望更改日期的格式。所以任何其他想法都会很棒。
    • 列的排序规则默认是 SQL_Latin1_General_CP1_CI_AS 因为我认为它也与此有关。
    • 我不建议更改排序规则。如果您需要以不同的格式显示日期,则必须 CONVERT 然后传递格式。现在您的日期存储为日期时间,这就是问题的范围。根据您想要呈现数据的方式,您现在可以在查询中转换它们或 .ToString()(在 C# 的情况下)它们以满足您的显示需求。
    • 当您说“SET DATEFORMAT dmy”时,它究竟做了什么?它是否告诉服务器正在更改的列具有 dmy 格式的数据,或者它是否将所有操作的日期格式更改为 dmy,如果是第二种情况,那么它不能按预期工作,因为正如我告诉你的那样日期仍以 yyyy-mm-dd 格式存储。如果有办法在日期列中以 dd/mm/yyyy 格式存储日期,请提出建议,因为它很重要。
    猜你喜欢
    • 2017-08-11
    • 2011-11-24
    • 2010-10-08
    • 2015-07-21
    • 2014-02-23
    • 2014-09-03
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多