我有一个 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 转换为日期时间时出错
答案 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))