SQL Server 如何在SQL中创建一个函数来从字符串中分割日期和时间?

mf98qq94  于 2023-02-03  发布在  其他
关注(0)|答案(3)|浏览(97)

如何在TSQL函数中删除“_”前面的值并在一行中显示日期和时间?
以下是示例:

Declare @inputstring as varchar(50) = 'Studio9_20230126_203052' ;

select value from STRING_SPLIT( @inputstring ,'_')

所需输出:2023-01-26 20:30:52.000

jv2fixgn

jv2fixgn1#

如果我们可以 * 安全地 * 假设值的格式总是{Some String}_{yyyyMMdd}_{hhmmss},那么您可以使用STUFF几次,首先删除前导字符串直到第一个下划线(_)字符(使用CHARINDEX来查找该字符),然后注射2个结肠(:)个字符。最后,您可以使用空格REPLACE剩余下划线(``),然后使用TRY_CONVERT尝试将该值转换为datetime2(0)

DECLARE @inputstring varchar(50) = 'Studio9_20230126_203052';

SELECT TRY_CONVERT(datetime2(0),REPLACE(STUFF(STUFF(STUFF(@inputstring,1,CHARINDEX('_',@inputstring),''),14,0,':'),12,0,':'),'_',' '));

请注意,这 * 并没有 * 给予您在问题中所需的值(2023-01-26 20:05:52.000),但我假设这是一个印刷错误,表示分钟的05应该是30

rnmwe5a2

rnmwe5a22#

创建函数

CREATE FUNCTION [dbo].[convert_to_date] (@inputstring NVARCHAR(MAX))
RETURNS DATETIME AS
BEGIN 

        DECLARE @finalString varchar(50), @out varchar(100)

        SET @finalString = REPLACE ( (SUBSTRING (@inputstring, CHARINDEX('_', @inputstring)+1 , LEN(@inputstring))), '_', ' ')
                    
        --SELECT @finalString

        SET @out  =  LEFT (@finalString, 4) + '-'               
                    + SUBSTRING(@finalString, 5, 2) + '-' 
                    + SUBSTRING(@finalString, 7, 2) + ' '
                    + SUBSTRING(@finalString, 10, 2) + ':'
                    + SUBSTRING(@finalString, 12, 2) + ':'
                    + SUBSTRING(@finalString, 14, 2) + '.000'
            
RETURN  @out
END

选择查询

SELECT dbo.[convert_to_date] ('Studio54541659_20230126_203052')

产出

2023-01-26 20:30:52.000
fnvucqvd

fnvucqvd3#

这将允许“somestring_YYYYMMDD_HHMISS”格式的“somestring”长度可变。

Declare @inputstring as varchar(50) = 'Studio9_20230126_203052' ;

 SELECT  DateAndTime = CONVERT(DATETIME,STUFF(STUFF(STUFF(v2.DT,14,0,':'),12,0,':'),9,1,' '))
        ,Identifier  = LEFT(@inputstring,v1.Pos1-1) --Included this because I know how people are :D --Comment out if not wanted.
        ,Original    = @inputstring --Original string just for checking. Comment out when happy.
   FROM (VALUES(CHARINDEX('_',@inputstring)))v1(Pos1) --Position of first Underscore
  CROSS APPLY (VALUES(SUBSTRING(@inputstring,v1.Pos1+1,50)))v2(DT) --String after first Underscore
;

输出如下所示,最后得到的是DATETIME数据类型。注解掉返回值中不希望的列。x1c 0d1x
我将把它转换成一个iTVF(内联表值函数),让您从中获得一些乐趣。请记住,任何包含“开始”的函数最终都会成为性能问题的一部分,因此请确保它是iTVF:D
编辑:污垢...我必须记住向下滚动。@拉穆已经发布了同样的东西,但它可能更好,更快,如果你只是想要的时间,而不是我包括的标识符。

相关问题