代码之家  ›  专栏  ›  技术社区  ›  dtc

T-SQL将varchar yyyy-MM-dd-hh.MM.ss.nnnnn转换为datetime

  •  1
  • dtc  · 技术社区  · 14 年前

    我有一个格式为yyy-MM-dd-hh.MM.ss.nnnnn的varchar

    例如:2010-09-17-20.52.31.870000

    我想把它转换成日期时间。。。但是MSSQL中的is date函数说这不是有效的日期,转换将不起作用。有没有办法使用convert函数来告诉它日期的格式?

    例如,2010-xx-r7-99.53esdfd.31.870000的无效数据。。。我会跳过这些数据,甚至不尝试转换。

    4 回复  |  直到 14 年前
        1
  •  1
  •   LittleBobbyTables - Au Revoir    14 年前

    据我所知,SQL Server 2005最多只支持3位数的毫秒,因此您可以用冒号替换句点,并获取左右部分(忽略日和小时之间的连字符),然后得出如下结果:

    DECLARE @myDate varchar(50)
    SET @myDate = '2010-09-17-20.52.31.870000'
    
    PRINT isdate(left(@myDate, 10) + ' ' + 
     replace(substring(@myDate, 12, 12), '.', ':'))  -- Should print '1'
    
    PRINT cast(left(@myDate, 10) + ' ' + 
        replace(substring(@myDate, 12, 12), '.', ':') as datetime)
    

    ... 有效地给你870毫秒

        2
  •  1
  •   wallyk    14 年前

    ISO 8601 标准用字母分隔日期和时间 T

        3
  •  1
  •   Guffa    14 年前

    您必须稍微更改标点符号才能使其工作,并将精度从微秒降低到毫秒。这是有效的:

    convert(datetime, '2010-09-17 20:52:31.870', 121)
    
        4
  •  1
  •   Hogan    14 年前

    你所得到的是一个有点不稳定,但这工作(测试):

    DECLARE @temp as varchar(50)
    
    SET @temp = '2010-09-17-20.52.31.870'
    
    SET @temp = replace(@temp,'.',':')
    set @temp = stuff(@temp,11,1,'T')
    set @temp = stuff(@temp,20,1,'.')
    
    select @temp
    
    select cast(@temp as datetime)
    

    我把多余的剪掉 0