从SQL中的无格式文本中解析日期

时间:2009-09-11 14:04:38

标签: sql sql-server tsql

我正在试图找出一种优雅的方法来从文本列中获取具有类似“YYYYMMDD”的数据的日期...所以我们可能会在列中看到“20060508”作为值,我希望能够从查询返回日期(2006年5月8日)。

我确信如果有足够的时间我可以一起破解一些东西,但我想的方法看起来很蹩脚,我怀疑在单个查询中有一种方法可以优雅地完成。

有什么建议吗?

4 个答案:

答案 0 :(得分:25)

这已经是一个有效的日期 - ISO-8601格式 - 只需使用:

SELECT CAST('20060508' AS DATETIME)

或者:

SELECT CONVERT(DATETIME, '20060508', 112)

这应该就好了!

为了获得“2006年5月8日”显示,请使用日期转换样式107执行另一个转换为varchar:

SELECT CONVERT(VARCHAR(25), CAST('2006-05-08' AS DATETIME), 107)

有关施法和放大的更多信息,请参阅here在MS SQL中转换

答案 1 :(得分:2)

select cast('20060508' as datetime) AS MyDate

给你这个结果......

MyDate
-----------------------
2006-05-08 00:00:00.000

有关施法和放大的更多信息,请参阅here在MS SQL中转换。

如果您正在尝试实现特定格式(2006年5月8日) - 您应该考虑将该列作为日期时间值返回,并让任何将该值显示给最终用户(网站,客户端应用程序) ,报告等)做格式化。如果您在查询中对其进行格式化,那么您将返回一个字符串,这将使将来更换前端格式变得更加困难。如果您想在SQL中执行此操作 - 请查看上面链接中的格式107。

答案 2 :(得分:1)

没有汗,只是CONVERT它。样式“112”,或ISO将处理您的示例案例。

SELECT CONVERT(datetime,'20060508',112)

返回

 ----------------------- 2006-05-08 00:00:00.000

 (1 row(s) affected)

答案 3 :(得分:1)

尝试:

SELECT REPLACE(CONVERT(varchar(30),CONVERT(datetime, '20060508'),107),' 0',' ')

输出:

-------------------
May 8, 2006

(1 row(s) affected)