
[英]How to create SQL STATEMENT to split date & add string between the date
[英]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.