将列从日期转换为日期时间

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 是否会忽略CONSTRAINTs? @Igor:不,我不这么认为。此选项只是防止可视化设计器通过重新创建表(使用新结构)而不是仅执行单个 T-SQL 语句来处理对数据库表的更改【参考方案3】:

您无法更改现有列的类型。您需要创建一个新列,将值复制过来,然后删除原始列。

SQL Management Studio 通常通过使用新列名创建临时表、复制值、删除具有旧列的原始表,然后将新临时表重命名为新名称来完成此操作。通常它会在人们甚至没有意识到的情况下做到这一点。

但是,这可能是一种非常具有侵略性的方法,特别是如果表中已经有很多行,因此您可能只想编写一个 SQL 脚本将新列添加到表中,复制值,删除原始列,然后使用 sp_rename 将新的临时列名称更改回原始列名称。这与 SQL Management Studio 所做的想法相同,只是它们删除并重新创建整个表,而您只是删除并重新创建列。

但是,如果您确实想让 SQL Manangement Studio 这样做,您可以关闭该错误消息。我相信它最初是添加的,因为人们不希望默认删除并重新创建表。要关闭此消息,请转到Tools->Options-?Designers,并取消选中“防止保存需要重新创建表的更改”,然后您应该可以在设计器中保存您的更改。

【讨论】:

您可以更轻松地完成它。 对不起。我的意思是 Damien_The_Unbeliever 的回答。

以上是关于将列从日期转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

dbReadTable 将日期列从 SQL 数据库强制转换为字符

将列值转换为日期时间以插入 AccessDB

将列字符串转换/解析为日期时间值 - 熊猫

Python/Pandas/Datetime:将列中的整个列表转换为日期时间

当str的格式为dd/mm/yyyy时,如何将列类型从str转换为日期?

Pandas - 将日期列从 dd/mm/yy hh:mm:ss 转换为 yyyy-mm-dd hh:mm:ss