我正在使用 SQL Server
我有一个表,其日期字段设置为 varchar,并且其中的日期格式不同
示例
OldDateOfBith
23/05/1990
4/6/1985
2001-01-06
我需要将此字段转换为日期时间类型的新字段
NewDateOfBith
1990-05-23
1985-06-04
2001-01-06
我可以使用
进行转换Cast(OldDateofBirth as datetime) -- will give error for 23/05/1990
CONVERT(DateTime, OldDateofBirth, 103) -- will give error for 2001-01-06
有没有办法转换所有日期而不考虑格式?
使用
TRY_CAST()
和 TRY_CONVERT
功能。这是解决您的问题的最佳且最简单的方法:
coalesce(TRY_CAST(OldDateofBirth as datetime),TRY_CONVERT(DateTime, OldDateofBirth, 103));
为了快速检查,您可以执行:
select coalesce(TRY_CAST('2001-01-06' as datetime), TRY_CONVERT(DateTime, '2001-01-06', 103));
文档链接:
由于您不知道字符串日期的确切日期格式,因此无法转换
例如“12/12/2018”在这里你不知道哪一天哪是月份
在下面找到一个仅关于问题上发布的格式的想法:
--- 查询数据---
INSERT INTO dbo.Test (OldDateOfBith) VALUES
('23/05/1990'),
('4/6/1985'),
('2001-01-06')
--- 查询---
SELECT
CASE
WHEN OldDateOfBith LIKE '____-__-__' THEN CONVERT(DATETIME2, OldDateOfBith, 120)
ELSE CONVERT(DATETIME2, OldDateOfBith, 103)
END AS NewDateOfBith
FROM
dbo.Test
上面的查询仅在以下版本的 SQL Server 上测试过:
Microsoft SQL Server 2016 (RTM-GDR) (KB4019088) - 13.0.1742.0 (X64) Jul 5 2017 23:41:17 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows 10 Home 6.3 <X64> (Build 17134: )
话虽如此,您可能需要分多个步骤运行。
SET DATEFORMAT dmy;
SELECT TRY_CAST ( OldDateofBirth AS datetime) as newbirddate from...