从T-SQL中的字符串中提取日期时间

时间:2018-10-16 08:48:08

标签: sql sql-server tsql datetime

我在SQL中存储了以下字符串:

  

John Doe批准的申请-MDat30 / 01/2018 10:54:31

使用以下T-SQL函数:

convert (datetime, substring(MD_SIGNATURE, charindex('/', MD_SIGNATURE,0)-2, 10),105) as MD_SIGN_DATE

这将输出以下内容:

  

2018-01-30 00:00:00.000

我需要帮助来获取整个时间戳,包括像这样的秒部分:

  

2018-01-30 10:54:31

谢谢。

4 个答案:

答案 0 :(得分:2)

最简单的方法是使用RIGHT(基于我们拥有的 1 示例)。假设格式始终为dd/MM/yyyy hh:mm:ss,日期始终为字符串的最后一部分,则:

DECLARE @s varchar(100) = 'Application approved by John Doe - MDat30/01/2018 10:54:31';

SELECT CONVERT(datetime2(0),RIGHT(@s,19),103);

答案 1 :(得分:2)

如果知道模式,则可以使用PATINDEX

SELECT
    str,
    CONVERT(DATETIME, SUBSTRING(str, PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]%', str), 19), 103) AS dt
FROM (VALUES
    ('Application approved by John Doe - MDat30/01/2018 10:54:31 Kitchen Sink')
) tests(str)

如果找不到日期(提示:NULLIF),可以对以上示例进行调整以返回null。结果:

| str                                                                     | dt                      |
|-------------------------------------------------------------------------|-------------------------|
| Application approved by John Doe - MDat30/01/2018 10:54:31 Kitchen Sink | 2018-01-30 10:54:31.000 |

答案 2 :(得分:0)

如果ORA-01821: date format not recognized 的最终参数长于字符串的其余部分,则将返回整个剩余的字符串。因此,只需更改您的最后一个参数即可。

SUBSTRING

在那里,你会

答案 3 :(得分:0)

对@larnu代码的轻微修改。

我使用了substring()而不是right()。因为如果date是结尾,可以使用Right()。但是子字符串可以提取日期,而不管位置如何。

__icontains