【问题标题】:How to convert string to datetime without seperator using sql?如何使用sql将字符串转换为没有分隔符的日期时间?
【发布时间】:2018-08-06 20:25:08
【问题描述】:

如何将此字符串转换为日期时间

20180227105954636241

select CONVERT(datetime, '20180227105954636241', 120)

从字符串转换日期和/或时间时转换失败。

【问题讨论】:

  • 我知道,我可以使用 substring 方法做到这一点,但我认为这不是正确的方式。我想回答而不是给出否定的分数。
  • 为了让您的问题变得更好,如果您在问题中包含该链接,表示您知道这种方式并证明您为什么认为这不是正确的方式,你正在寻找另一种方式。我认为这实际上会给你带来积极的影响,而不是消极的。
  • 这对您来说可能是“显而易见的”,但您应该清楚地说明您希望该字符串产生什么日期时间。包含多个示例通常也很好。我可以对该字符串应用对 me 来说似乎很明显的解释,但我们如何知道我们的解释是否与您的一致?
  • 我建议使用 STUFF 函数,但无论采用何种方法 - 您都可以将解决方案合并到一个 VIEW 中,将其转换为正确的格式。那么你就不用担心具体的实现了。

标签: sql sql-server datetime converter


【解决方案1】:

根据您的问题,我可以建议使用 SUBSTRING 方法并解析 NVARCHAR 值,然后将其转换为 DATETIME。

DECLARE @date NVARCHAR(MAX) = '20180227105954636241'

DECLARE @year NVARCHAR(4) = SUBSTRING(@date,0,5)
DECLARE @month NVARCHAR(2) = SUBSTRING(@date,5,2)
DECLARE @day NVARCHAR(2) = SUBSTRING(@date,7,2)
DECLARE @hours NVARCHAR(2) = SUBSTRING(@date,9,2)
DECLARE @minutes NVARCHAR(2) = SUBSTRING(@date,11,2)
DECLARE @seconds NVARCHAR(2) = SUBSTRING(@date,13,2)
DECLARE @milliseconds NVARCHAR(2) = SUBSTRING(@date,15,3)

SELECT CONVERT(DATETIME, (@Year + '-' + @month + '-' + @day + ' ' + @hours + ':' + @minutes + ':' + @seconds + '.' + @milliseconds), 120)

【讨论】:

    【解决方案2】:

    您不能直接将这些带模式的字符串转换为datetime,而且我看不到为此目的使用CONVERT 函数。您可以将下面的字符串格式化为cast它:

    DECLARE @date VARCHAR(MAX) = '20180227105954636241'
    DECLARE @date1 VARCHAR(30) 
    
    set @date1 = SUBSTRING(@date,  1, 8) + ' ' +  -- this is datepart
                 SUBSTRING(@date,  9, 2) + ':' +  -- this is hour
                 SUBSTRING(@date, 11, 2) + ':' +  -- this is minute
                 SUBSTRING(@date, 13, 2) + '.' +  -- this is second
                 SUBSTRING(@date, 15, 6)          -- this is decimal of second
    
    select cast(@date1 as datetime2(6))  -- 6 is the decimal point of second
    

    输出

    2018-02-27 10:59:54.636241
    

    【讨论】:

      【解决方案3】:

      您可以使用STUFF 函数插入必要的冒号、句点和破折号。 STUFF 有 4 个参数。首先是要填充字符的字符串,第二是在字符串中的位置,第三是要删除的字符数(在本例中始终为 0),第四是要插入的字符。

      填充后,这会产生一个 26 个字符长的字符串,但转换为 datetime 只接受 23 个字符。您必须取此值的LEFT 23,将字符串的最后 3 个字符截断以转换为日期时间数据类型。

      DECLARE @temp varchar(100) = '20180227105954636241'
      SELECT CONVERT(datetime, LEFT(STUFF(STUFF(STUFF(STUFF(STUFF(STUFF(@temp, 15, 0, '.'), 13, 0, ':'), 11, 0, ':'), 9, 0, ' '), 7, 0, '-'), 5, 0, '-'), 23), 120)
      

      【讨论】:

        猜你喜欢
        • 2013-07-20
        • 2019-04-12
        • 2021-01-05
        • 1970-01-01
        • 2015-04-25
        • 1970-01-01
        • 2021-06-26
        • 2017-05-05
        相关资源
        最近更新 更多