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

从T-SQL中的字符串提取日期时间,sql,sql-server,tsql,datetime,Sql,Sql Server,Tsql,Datetime,我在SQL中存储了以下字符串: John Doe批准的申请-2018年1月30日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 谢谢。如果

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

John Doe批准的申请-2018年1月30日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


谢谢。

如果
子字符串
的最后一个参数长于字符串的剩余部分,则将返回整个剩余字符串。所以只需更改最后一个参数

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

如果子字符串的最后一个参数比字符串的剩余部分长,则返回整个剩余字符串。所以只需更改最后一个参数

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

你就在那里。

更简单的方法是使用
(基于我们的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);

更简单的方法是使用
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);

对@larnu代码进行轻微修改

我使用了substring()而不是right()。因为如果日期在末尾,则可以使用Right()。但子字符串可以提取日期,而不考虑位置

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

SELECT CONVERT(datetime2(0),Substring(@s,charindex('/', @s,0)-2,19),103);

对@larnu代码进行轻微修改

我使用了substring()而不是right()。因为如果日期在末尾,则可以使用Right()。但子字符串可以提取日期,而不考虑位置

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

SELECT CONVERT(datetime2(0),Substring(@s,charindex('/', @s,0)-2,19),103);
如果您了解模式,则可以使用:

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)
如果找不到日期,可以调整上述示例以返回null(提示:
NULLIF
)。结果:

如果您了解模式,则可以使用:

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)
如果找不到日期,可以调整上述示例以返回null(提示:
NULLIF
)。结果:


您了解当前代码的功能吗?它定位
/
的位置,从该位置减去2,然后从该点向前提取10个字符。你认为这里有明显的改变来包含时间部分吗?你知道你当前的代码是做什么的吗?它定位
/
的位置,从该位置减去2,然后从该点向前提取10个字符。你认为这里有明显的改变来包括时间部分吗?很高兴这对你有用,尽管这里也有一些其他的好答案。请稍等片刻,单击答案左侧的灰色复选标记,标记您已接受的答案。它让其他用户知道问题有答案,奖励回答问题的用户一些信誉点,你也会得到一些。谢谢。事实上,我试着标出答案,但我找不到办法。我选择了你的答案,因为它清晰、简单、直截了当。很高兴这对你有用,尽管这里也贴了一些其他的好答案。请稍等片刻,单击答案左侧的灰色复选标记,标记您已接受的答案。它让其他用户知道问题有答案,奖励回答问题的用户一些信誉点,你也会得到一些。谢谢。实际上,我试着标出答案,但我找不到办法。我选择了你的答案,因为它清晰、简单、直截了当。我喜欢
NULLIF
的想法。我用得不够频繁+我喜欢
NULLIF
的想法。我用得不够频繁+谢谢你提醒我。