2016-09-16 396 views
0

使用SQL,是否有一种优雅的方式来删除日期后的'th''rd'和'st'?这里是我如何做,但我宁愿做一些像正则表达式回忆(下面的例子)。sql日期格式patindex正则表达式替换召回

请不要带while循环的函数。我已经看到了这些解决方案,我正在寻找一些不那么难看的东西。

select Replace('september 8th, 2016', Substring('september 8th, 2016', PatIndex('%[a-z,A-Z][a-z,A-Z],%', 'september 8th, 2016'), 2), '') statdate2 

如果使用召回我可以做类似下面

/(\s[0-9]+)[a-z,A-Z]{2}\,/ 

和召回日期编号与更换

$1, 

什么作为,是我的模式在矿井SQL示例可以拉在任何两个字符后面跟着一个逗号,这个逗号在99%的时间内都很好,但是确实会匹配一些不想要的日期错误格式,用户在该月份后放置逗号。

回答

0

那么你可以写一个使用正则表达式回忆的CLR函数。

顺便说一下,您当前的查询会替换整个日期字符串。

如果您要替换的后缀存在于月份名称中,则会成为问题。

例如,当我在8月1日运行你的逻辑,是这样的:

select Replace('august 1st, 2016', Substring('august 1st, 2016', PatIndex('%[a-z,A-Z][a-z,A-Z],%', 'august 1st, 2016'), 2), '') statdate2 

我得到:

augu 1年,2016年

如果你想有一个非CLR解决方案的工作,你可能需要通过它们在字符串中的位置来消除字符,而不是使用REPLACE()。意思是在后缀之前获取所有字符,并将其与后缀后的所有字符连接起来。它不会很漂亮,但正如我所说,如果你想漂亮,你可以去CLR。

+0

谢谢,是的,我想避免CLR。顺便说一句,我在SQL Mgmt Studio中运行了SQL,它取代了数字后缀。 –

+0

这真的是应该在前端处理的那种东西。 SQL不适用于这类工作。 –

+0

我同意,但我不控制前端。 –