【问题标题】:How to convert nvarchar string mm/dd/yyyy hh:mm:ss to datetime?如何将 nvarchar 字符串 mm/dd/yyyy hh:mm:ss 转换为日期时间?
【发布时间】:2021-08-29 16:33:48
【问题描述】:

我有一个 nvarchar 列,其日期格式如下:“04/18/2021 13:04:15”(不带引号)。我想将此列更改为日期时间并迁移所有数据。我查找了格式代码并发现,与我的变体最接近的代码是美国(101)。所以我尝试了

UPDATE DropPhotos
SET CreationDateTime = CONVERT(NVARCHAR(255), CONVERT(DateTime, CreationDateTime, 101))
ALTER TABLE DropPhotos
ALTER COLUMN CreationDateTime DateTime

但我得到错误:

将数据类型 nvarchar 转换为日期时间时出错

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql sql-server tsql datetime


【解决方案1】:

如果您拥有的格式只是您列出的 2 种格式:

 Select t.CreationDateTime
      , us_101_format = try_convert(datetime, t.CreationDateTime, 101)
      , german_104_format = try_convert(datetime, t.CreationDateTime, 104)
      , dt.CreationDateTime
   From (Values ('04/18/2021 13:04:15'), ('26.04.2021 06:09:03'))                       As t(CreationDateTime)
  Cross Apply (Values (coalesce(try_convert(datetime, t.CreationDateTime, 101)
                              , try_convert(datetime, t.CreationDateTime, 104))))       As dt(CreationDateTime)
  --Where dt.CreationDateTime Is Null;
  Where dt.CreationDateTime Is Not Null;

如果您还有一些格式为“mm.dd.yyyy hh:mm:ss”,那么您将很难确定该条目使用哪种格式。

如果您有其他独特的格式,您可以添加到该格式的转换列表中。

【讨论】:

    【解决方案2】:

    首先,您不应该将日期/时间值作为字符串存储在数据库中。当然,如果下一步是将列更改为datetime(或类似的东西),您所做的一切都很好。

    其次,您显然有不良数据。所以,使用try_convert() 找到它:

    select CreationDateTime
    from DropPhotos
    where try_convert(DateTime, CreationDateTime, 101) is null and
          CreationDateTime is not null;
    

    您需要弄清楚如何处理这些不良价值观。如果NULL 是可以接受的,那么只需在原始逻辑中使用try_convert()

    SET CreationDateTime = CONVERT(NVARCHAR(255), TRY_CONVERT(DateTime, CreationDateTime, 101))
    

    【讨论】:

    • 通过您的查询,我发现我有一些不同格式的日期:26.04.2021 06:09:03 我可以同时处理这两个日期吗?
    • @Fallingsappy 。 . .我建议您提出另一个问题,并提供清晰的样本数据和所需的结果。这回答了您在此处提出的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多