将列从日期转换为日期时间
Posted
技术标签:
【中文标题】将列从日期转换为日期时间【英文标题】:Convert Column from Date to Datetime 【发布时间】:2011-12-08 11:51:18 【问题描述】:我有一个名为Lastmodified
的列,数据类型为Date
,但它应该是DateTime
。
有什么方法可以转换列吗?
当我使用 SQL Server Management Studio 的“设计”功能时,我收到以下错误:
不允许保存更改。您所做的更改需要以下内容 要删除并重新创建表。
对删除表不是很感兴趣,我只是想知道是否可以将列从 Date
转换为 Datetime
或者我是否必须删除该列并创建一个具有正确数据类型的新列?
【问题讨论】:
当然你可以转换这个 - 但要这样做,SQL Server Mgmt Studio 中的可视化设计器将使用DATETIME
创建你的新表,复制数据,然后删除旧表,然后Tools > Options
中有一个选项可以默认阻止这种情况 - 请参阅我的回复
【参考方案1】:
它不需要删除表并重新创建它,除非该列参与一个或多个约束。
您可以使用 SQL 来完成:
ALTER TABLE Tab ALTER COLUMN LastModified datetime2 not null
(我选择datetime2
而不是datetime
,因为前者是recommended for all new development work,并且由于列当前是date
,所以我知道您使用的是SQL Server 2008或更高版本)
【讨论】:
我正在使用代号为“Denali”的 SQL Server 管理工作室,所以看起来它们不会改变它的工作方式。【参考方案2】:这只是 SQL Server Mgmt Studio 中的一项安全设置 - 如果您喜欢冒险,可以将其关闭 :-)
禁用那里的复选框,你可以做任何你喜欢的事情!
【讨论】:
如果关闭此选项,SQL Server 是否会忽略CONSTRAINT
s?
@Igor:不,我不这么认为。此选项只是防止可视化设计器通过重新创建表(使用新结构)而不是仅执行单个 T-SQL 语句来处理对数据库表的更改【参考方案3】:
您无法更改现有列的类型。您需要创建一个新列,将值复制过来,然后删除原始列。
SQL Management Studio 通常通过使用新列名创建临时表、复制值、删除具有旧列的原始表,然后将新临时表重命名为新名称来完成此操作。通常它会在人们甚至没有意识到的情况下做到这一点。
但是,这可能是一种非常具有侵略性的方法,特别是如果表中已经有很多行,因此您可能只想编写一个 SQL 脚本将新列添加到表中,复制值,删除原始列,然后使用 sp_rename 将新的临时列名称更改回原始列名称。这与 SQL Management Studio 所做的想法相同,只是它们删除并重新创建整个表,而您只是删除并重新创建列。
但是,如果您确实想让 SQL Manangement Studio 这样做,您可以关闭该错误消息。我相信它最初是添加的,因为人们不希望默认删除并重新创建表。要关闭此消息,请转到Tools->Options-?Designers,并取消选中“防止保存需要重新创建表的更改”,然后您应该可以在设计器中保存您的更改。
【讨论】:
您可以更轻松地完成它。 对不起。我的意思是 Damien_The_Unbeliever 的回答。以上是关于将列从日期转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章
dbReadTable 将日期列从 SQL 数据库强制转换为字符
Python/Pandas/Datetime:将列中的整个列表转换为日期时间