【问题标题】:T-SQL convert varchar yyyy-MM-dd-hh.mm.ss.nnnnnn into datetimeT-SQL 将 varchar yyyy-MM-dd-hh.mm.ss.nnnnnn 转换为日期时间
【发布时间】:2010-11-10 10:23:19
【问题描述】:

这是在 MS SQL Server 中。

我有一个格式为 yyyy-MM-dd-hh.mm.ss.nnnnnn 的 varchar

例如:2010-09-17-20.52.31.870000

我想把它转换成日期时间...但是 MSSQL 中的 ISDATE 函数说这不是一个有效的日期并且 CONVERT 不起作用。有没有办法使用转换函数,以便我可以告诉它日期的格式?

我还想首先检查它是否是有效日期,因为 varchar 输入可能不包含任何内容,或者它可能包含无效日期。

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

【问题讨论】:

  • '2010-09-17-20.52.31.870000' 不是有效的日期时间。您在时间部分之前有一个额外的破折号
  • 我想这就是 ISDATE 无法识别它的原因,但这是给我的数据。我仔细检查了,它是时间部分之前的一个破折号。

标签: sql-server-2005 tsql


【解决方案1】:

据我所知,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】:

ISO 8601 标准用字母 T 分隔日期和时间。也许这就是成功转换所需的全部内容?一些转换实现也接受一个空间。我从来没有在那儿看到过连字符。

【讨论】:

  • 感谢您的提示。也许我可以使用它...将第 11 个字符替换为 T...?
  • @metanaito -- 我尝试用 T 替换第 11 个字符,但这不适用于 isdate 或强制转换
  • 谢谢,是的,我想输入还有其他问题,就像您和其他人指出的那样。
【解决方案3】:

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

convert(datetime, '2010-09-17 20:52:31.870', 121)

【讨论】:

    【解决方案4】:

    你得到的有点不稳定,但这有效(经过测试):

    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)
    

    注意我切断了额外的0s,如果真的有那些额外的,你可以用子字符串来做。

    【讨论】:

      猜你喜欢
      • 2013-10-19
      • 2018-02-24
      • 2023-03-27
      • 2016-02-03
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      相关资源
      最近更新 更多