将各种类似日期的字符串(varchar)转换为一个DATE字段

时间:2011-08-25 19:19:08

标签: sql regex sql-server-2008

考虑一个varchar字段(ShipDate),它获取写入日期的字符串。这些字符串来自多种不同格式的第三方系统(我显然没有控制权= /)。

我决定创建一个视图,将此varchar字段转换为DATE,以便我可以轻松查询(并过滤掉一些我不关心的其他记录/字段)。< / p>

到目前为止,我看到有两种格式:YYYYMMDD(很好,我可以只是一个直的CONVERT)和MM / DD / YYYY,这会导致错误:

Conversion failed when converting date and/or time from character string.

这会将我的转换从简单的CONVERT(DATE, ShipDate, 1)更改为:

CONVERT (DATE,
(CASE 
    WHEN ShipDate LIKE '_/__/____' THEN SUBSTRING(ShipDate, 6, 4) + '0' + SUBSTRING(ShipDate, 1, 1) + SUBSTRING(ShipDate, 3, 2)--M/DD/YYYY
    WHEN ShipDate LIKE '__/_/____' THEN SUBSTRING(ShipDate, 6, 4) + SUBSTRING(ShipDate, 1, 2) + '0' + SUBSTRING(ShipDate, 4, 1)--MM/D/YYYY
    WHEN ShipDate LIKE '_/_/____' THEN SUBSTRING(ShipDate, 5, 4) +  '0' + SUBSTRING(ShipDate, 1, 1) + '0' + SUBSTRING(ShipDate, 3, 1)--M/D/YYYY
    ELSE ShipDate --For the YYYYMMDD dates
END), 1) --End of CONVERT

是否有更好的方法来执行上述SQL语句?随着时间的推移,我可能会获得更多类似日期的字符串格式,因此上面的示例可以变得非常糟糕(我用标记了这个问题,以防可能减少case语句的大小。)

或者,是否有办法处理此问题,因为记录进入,完全避免了视图?我对Triggers / SP不太熟悉,但如果这是一个很好的选择,我愿意去那条路=)

或者,通常用于解决此问题的其他一些方法?只是好奇这一点。我是一名.NET程序员,但最终帮助了SQL工作,因为我有一些经验,所以我对SQL中的任何高级内容都很陌生。

4 个答案:

答案 0 :(得分:2)

不要将date_style参数用于CONVERT。这真的是为了转向另一个方向。您应该只能使用:CAST(some_string AS DATE)

如果您开始以DD / MM / YYYY格式开始获取日期,则可能会遇到一些问题。当然,如果他们混在一起,那么无论如何也无法解决这个问题,因为即使你不知道4/1/2011是4月1日还是1月4日。

答案 1 :(得分:1)

如果已知格式总是M然后D,并且分隔符总是/,为什么不只是解析斜杠?另外,为什么在,1)中使用CONVERT?所有上述格式在没有它的情况下似乎转换为正常:

WITH x(ShipDate) AS
(
    SELECT '5/12/2011'
    UNION ALL SELECT '05/5/2012'
    UNION ALL SELECT '05/05/2012'
)
SELECT CONVERT (DATE, ShipDate) FROM x;

答案 2 :(得分:1)

你说你可以和YYYYMMDD合作吗?

但是MM / DD / YYYY给你带来了麻烦。那么也许你可以这样做:

CONVERT(varchar(8),CAST('MM/DD/YYYY' as datetime),112) = YYYYMMDD

答案 3 :(得分:1)

我的反应是添加一个正确的日期列,然后实现一个触发器,转换到该日期列。

然后您可以手动修复任何无法转换的内容,并且这些记录仍然具有值,与视图解决方案不同。