繁体   English   中英

如何创建一个 function 来从 SQL 中的字符串中拆分日期和时间?

[英]How to create a function to split date and time from a string in SQL?

如何删除“_”之前的值并在 TSQL Function 中的一行中显示日期和时间?

以下是示例:

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

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

Output 要求: 2023-01-26 20:30:52.000

如果我们可以安全地假设该值始终采用{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,':'),'_',' '));

请注意,这并没有给出您在问题中想要的值 state ( 2023-01-26 20:05:52.000 ),但我认为这是一个印刷错误,分钟的05应该是30

创建 function

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 查询

SELECT dbo.[convert_to_date] ('Studio54541659_20230126_203052')

Output

2023-01-26 20:30:52.000

这将容忍“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
;

Output 看起来像这样,您最终得到一个 DATETIME 数据类型。 在返回的列中注释掉您不想要的内容。 在此处输入图像描述

我将通过将其转换为 iTVF(内联表值函数)来让您获得一些乐趣。 请记住,任何包含“BEGIN”的 function 最终都会成为性能问题的一部分,因此请确保它是 iTVF:D

编辑:Crud...我得记得向下滚动。 @Lamu 已经发布了同样的东西,但如果你只想要时间而不是我包含的标识符,它可能会更好更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM