尝试在SQL中导入相当不寻常的格式化日期时间字符串。源是来自思科网络系统的自动导出,我无法更改其格式。
格式为Sun Dec 02 03:59:54 CET 2018
尝试了datetimefrompart(),convert()与substring()的组合
CREATE FUNCTION [dbo].[Cisco2dateTime]
( @CDate varchar(28)) RETURNS datetime
AS
BEGIN
RETURN ( datetimefromparts(
right(@CDate,4),
case substring(@CDate,5,3) when 'Jan' then '01' when 'Feb' then '02' when 'Mar' then '03' when 'Apr' then '04' when 'May' then '05' when 'Jun' then '06' when 'Jul' then '07' when 'Aug' then '08' when 'Sep' then '09' when 'Okt' then '10' when 'Nov' then '11' when 'Dec' then '12' END,
substring(@CDate,9,2),
substring(@CDate,12,2),
substring(@CDate,15,2),
substring(@CDate,18,2),0) )
END
GO
}
有什么办法能更有效地做到这一点吗?
发布于 2018-12-18 03:25:57
如果传入的格式是一致的,您可以将其缩小为如下所示:
DECLARE @time NVARCHAR(28) = 'Sun Dec 02 03:59:54 CET 2018'
SELECT CAST(SUBSTRING(@time,4,17) + RIGHT(@time,4) AS DATETIME)
返回2018-12-02 03:59:54.000
为@Clockwork-Muse编辑
如果你想包括时区信息,你可以使用时区表来匹配缩写,或者,如果你只有几个可能的时区,你可以使用表值构造函数,如新示例中的,它将返回一个timezoneoffset:
DECLARE @time NVARCHAR(30) = 'Sun Dec 02 03:59:54 CET 2018'
SELECT TODATETIMEOFFSET(CAST(SUBSTRING(@time,4,17) + RIGHT(@time,4) AS DATETIME), z.TZOffset)
FROM
(
VALUES ('CET','+01:00'),('AST','+03:00'),('NZDT','+13:00')
)AS z(TZName, TZOffset)
WHERE @time LIKE '%'+z.TZName+'%'
https://stackoverflow.com/questions/53818703
复制相似问题