将varchar转换为日期

时间:2018-07-09 02:15:23

标签: sql sql-server date casting

我正在使用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

是否有一种转换所有日期而不管格式如何的方法?

3 个答案:

答案 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));

文档链接: