我正在使用SQL Server
我有一个表,其中的日期字段设置为varchar,并且其中的日期格式不同
示例
OldDateOfBith
23/05/1990
4/6/1985
2001-01-06
我需要将此字段转换为datetime类型的新字段
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
是否有一种转换所有日期而不管格式如何的方法?
答案 0 :(得分:1)
由于您不知道字符串日期的确切日期格式,因此无法进行转换
例如'12 / 12/2018'在这里,您不知道哪个是天,哪个是月
答案 1 :(得分:1)
在问题的下面仅找到一个想法:
---查询数据---
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: )
话虽如此,您可能需要分多个步骤来运行它。
答案 2 :(得分:1)
使用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));
文档链接: