【问题标题】:Converting varchar date field to datetime datatype [duplicate]将varchar日期字段转换为日期时间数据类型[重复]
【发布时间】:2020-12-15 19:28:27
【问题描述】:

我错误地使用 varchar 存储代表日期/时间的数据。现在我正在尝试转换我的文本数据列,存储为 varchar,如下所示:

2020-11-25T14:22:41.3539327Z

放入存储日期时间数据类型的列中。

【问题讨论】:

  • 幸运的是,这是一种明确的格式,所以cast(field as datetime2)cast(field as datetimeoffset) 可以工作。我怀疑如果您从 SSMS 更改类型或使用 ALTER TABLE 数据将毫无问题地转换
  • @DaleK 不,我不这么认为。可能是部分原因,但我的日期时间中的 Z 似乎会导致问题。
  • @PanagiotisKanavos 我相信您的回答也会出现同样的问题。事实上,我在发帖之前尝试使用 ALTER TABLE。有没有一种简单的方法可以省略演员表中的最后一个角色?
  • @FastQ 当然,但技术是一样的。如果您要检查official docs,它应该始终是您的第一个停靠港,您会找到正确的格式来转换您的日期。
  • 什么same problem?您只问如何转换数据。 cast 有效。 UTC 指标根本不是问题,不应删除

标签: sql-server


【解决方案1】:

如果你所有的数据都是yyyy-MM-ddThh:mm:ss.nnnnnnn的格式,那么你可以改变列的数据类型:

ALTER TABLE dbo.YourTABLE ALTER COLUMN YourColumn datetime2(7);

如果您需要其中的时区,请改用datetimeoffset(7)

【讨论】:

  • 我必须删除一个默认约束,但这有效。我认为这里的每个解决方案都可以,但默认约束是真正的问题。谢谢!
【解决方案2】:
-- to fix it you can use convert, below uses GetDate for examaple
SELECT convert(varchar, getdate(), 120)

根据您需要的精度,您可以使用下面的链接找到它并将 120 更改为该精度所需的任何数字。

https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-using-sql-server/

要修复您的表格,您应该按照以下步骤操作:

  1. 在您的表中为 DateTime 添加一个新列
  2. 使用上面的转换在您的表上运行更新,以使用您的 varchar 字段中的转换值更新新列。
  3. 然后删除包含 varchar 数据的列。

执行上述步骤的代码

ALTER TABLE dbo.TableName ADD NewDateTimeCOL DATETIME

-- NOTE if your table is LARGE you will not want to do a direct update like this but do looping for performace purposes
UPDATE dbo.TableName
SET NewDateTimeCOL = convert(varchar, OldDateTimeCOL, 120)


ALTER TABLE dbo.TableName DROP COLUMN OldDateTimeCOL

【讨论】:

  • 这会失去准确性,datetime 只能精确到 1/300 秒。
  • 我使用的格式似乎不是(注意之后的 Z 代表通用时间,来自 Java 的 ZonedDateTime 类)。我错过了什么吗?需要明确的是,我不需要比 1 秒更精确的精度。
  • @FastQ Z 没问题。事实上,这种特定格式是最容易转换的,因为它是明确的 - 由于本地化设置,无法混淆它。那不是 Java 格式,那是 ISO8601 日期时间格式
  • 即使在没有 Z 的情况下进行测试时也遇到了问题。 “从字符串转换日期和/或时间时转换失败。”也无法使用 SSMS 进行转换。
  • @FastQ 听起来您有一些日期以其他格式存储。因为张贴的工作正常。您可能需要使用try_convert 来确定失败的日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2013-01-15
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多