考虑一个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语句?随着时间的推移,我可能会获得更多类似日期的字符串格式,因此上面的示例可以变得非常糟糕(我用regex标记了这个问题,以防可能减少case语句的大小。)
或者,是否有办法处理此问题,因为记录进入,完全避免了视图?我对Triggers / SP不太熟悉,但如果这是一个很好的选择,我愿意去那条路=)
或者,通常用于解决此问题的其他一些方法?只是好奇这一点。我是一名.NET程序员,但最终帮助了SQL工作,因为我有一些经验,所以我对SQL中的任何高级内容都很陌生。
答案 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)
我的反应是添加一个正确的日期列,然后实现一个触发器,转换到该日期列。
然后您可以手动修复任何无法转换的内容,并且这些记录仍然具有值,与视图解决方案不同。