如何从SQL中的字符串中提取日期?

时间:2015-04-06 14:57:08

标签: sql regex

我似乎无法找到如何从列中的字符串中提取日期。 e.g:

2015-03-30T04:04:26+0200 -> 30.3.2015 

我试图寻找正则表达式查询,但它对我不起作用。

2 个答案:

答案 0 :(得分:0)

选项1:纯SQL解决方案

即。 MySQL的

因为你在这里问SQL,怎么样:

SELECT DATE_FORMAT(DATE("2015-03-30T04:04:26+0200"),"%d.%m.%Y")

返回

30.03.2015

即。甲骨文

如果要在Oracle上运行此查询,则必须调整查询:

SELECT TO_CHAR(TO_DATE(SUBSTR('2015-03-30T04:04:26+0200', 1, 10),'YYYY-MM-DD'),'DD.MM.YYYY') myDate FROM dual

即。的PostgreSQL

此处还有一些查询差异。实际上和Oracle完全一样。我在这里作弊并将最后的0200移动到US,这实际上是微秒,但是给了我们一个有效的解析格式字符串,而不必使用SUBSTR

SELECT TO_CHAR(TO_DATE('2015-03-30T04:04:26+0200','YYYY-MM-DD"T"HH24:MI:SS+US'),'DD.MM.YYYY')

即。 SQLite的

现在这里有一个完全不同的功能。 SQLite使用strftime()来格式化日期。但在这里我再次使用substr()

SELECT STRFTIME('%d.%m.%Y',DATE(SUBSTR('2015-03-30T04:04:26+0200',1,10)))

现在我可以继续使用MS SQL Server以及更多但我认为这些替代方案你应该找到一种将问题转换为DBMS SQL语法的方法。

选项2:纯RegEx解决方案

PCRE RegEx(Python,PHP等)

或者如果你想使用普通的正则表达式:

(\d+)-(\d+)-(\d+)T.*

代替的

\3.\2.\1

你可以在这里玩: RegEx Fiddle Demonstration

Javascript,Java等

根据您的编程语言,您可能需要将RegEx更改为:

([0-9]+)-([0-9]+)-([0-9]+)T.*

和您的替换字符串

$3.$2.$1f

答案 1 :(得分:0)

以下内容适用于许多数据库:

select cast(left(col, 10) as date)