如何将 nvarchar 字符串 mm/dd/yyyy hh:mm:ss 转换为日期时间?

时间:2021-06-13 13:42:40

标签: sql sql-server tsql datetime

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

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

但我得到错误:

<块引用>

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

2 个答案:

答案 0 :(得分: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”,那么您将很难确定该条目使用哪种格式。

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

答案 1 :(得分:0)

首先,您不应将日期/时间值作为字符串存储在数据库中。当然,如果下一步是将列更改为 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))