2017-07-26 184 views
1

在SQL Server 2014年,我有一个varchar列有多个日期格式:VARCHAR值到日期格式

shipdate 
----------- 
12/29/2014  -- mm/dd/yyyy 
5/20/15   -- mm/dd/yy 
2012/05/22  -- yyyy/mm/dd 

我想将它们转换为YYYY/MM/DD日期格式,但我做不到,我试过:

CAST(SRD.[ShipDate] AS DATEtime) 

没有成功。

有什么想法?

+3

这就是为什么你在不VARCHAR列存储日期。如果你不知道每一行的格式,我认为你坚持尝试和失败,并尝试每一行。 – Jamiec

+3

我想知道如果没有可用的格式信息,你将如何解码10/11/12? – Serg

回答

4

嗯。 。 。你真的想把日期存储为日期。你的情况,你可以使用try_convert(),并保持试验,直到它的工作原理:

select coalesce(try_convert(date, shipdate), 
       try_convert(date, shipdate, 1), 
       try_convert(date, shipdate, 101) 
       ) as presumed_date 
+2

运行此代码,交叉手指,并希望没有任何日期足够模糊,不能正确解析 – Jamiec

+0

它的工作!,这里的奇怪的事情是,我有其他列具有相同的值和格式,并与一个简单的演员工作:S –

-1

目前尚不清楚是否正在试图做到这一点查询或尝试将数据下迁移到不同的列,所以我的例子需要填写并加入你的具体需求。 (将...替换为适合的)。你可以应用一个特定的格式并使用try convert。然后多次迭代的数据集来捕获所有值:

SET DATEFORMAT mdy; 
    -- ... 
    TRY_CONVERT(datetime2, [ShipDate]) AS Result; 
    -- ... 
    GO 

    SET DATEFORMAT dmy; 
    -- ... 
    TRY_CONVERT(datetime2, [ShipDate]) AS Result; 
    -- ... 
    GO 

    -- ... 
0

CONVERT会工作得很好,虽然样式将需要111

SELECT CONVERT(VARCHAR(10),CAST(SRD.[ShipDate] AS DATETIME),111); 

你的代码示例显示日期,虽然没时间;另外,我没有看到你想按照你的问题看到时间。因此,我建议您实际将其转换为DATE而不是DATETIME - 如下面的查询所示。

SELECT CONVERT(VARCHAR(10),CAST(SRD.[ShipDate] AS DATE),111); 
0
SELECT CONVERT(VARCHAR(10),CAST(SRD.[ShipDate] AS DATE),111); 

这应该工作,因为你要找的风格是111