Strange (Cisco) 日期时间字符串到SQL日期时间

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (47)

试图在SQL中导入一个相当不寻常的格式化日期时间sting。Source是从Cisco网络系统自动导出的,我不能改变它的格式。

格式为Sun Dec 02 03:59:54 CET 2018

试过datetimefromparts(),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

}

如何更有效地做到这一点?

提问于
用户回答回答于

如果传入格式是一致的,您可以将其缩小为如下所示:

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

如果要包含时区信息,可以使用时区表来匹配缩写,或者如果您只有少数潜在的时区,则可以使用表示值构造函数,如新示例中将返回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+'%'

扫码关注云+社区

领取腾讯云代金券