【问题标题】:Convert varchar to date将 varchar 转换为日期
【发布时间】:2010-10-06 21:06:27
【问题描述】:

我(不幸的是)有一些日期被保存到 varchar 列中。这些列包含以下格式的日期:

mmddyy

例如:

010110

我需要将这些值导入到一个设置为日期时间的表格中,并像这样格式化日期:

2010-09-17 00:00:00.000

如何将上面的字符串转换为下面的日期时间值?

【问题讨论】:

  • 您的示例可能是二进制 (010110)。开个玩笑。
  • 鲍勃哈哈。是的,应该用一个更好的例子。 :)

标签: sql sql-server database tsql


【解决方案1】:

CAST 函数会执行此操作,问题是它会假设您的前 2 位数字是年份。这应该适合你:

SELECT CAST((RIGHT('010110',2) + LEFT('010110',4)) AS DATETIME)

这是假设所有日期都是 MMDDYY。

【讨论】:

  • 这在文字上效果很好,但是当我尝试在 varchar 字段上使用它时,我收到错误“将 varchar 数据类型转换为 datetime 数据类型导致超出-范围值。”
  • 问题是我在所有五位数日期的开头添加了一个 0(例如 11010 而不是 011010)但随后进行了回滚 - 所以我试图针对不正确的字符串运行它,一旦我添加并提交前导 0 一切正常。谢谢。
【解决方案2】:

解决办法

SELECT CAST(SUBSTRING(@date, 5, 2) + SUBSTRING(@date, 1, 4) AS DATETIME)

【讨论】:

    【解决方案3】:

    将字符串转换成YYMMDD格式,你应该状态良好:

    declare @x varchar(6)
    set @x = '091710'
    
    declare @d datetime
    
    set @d = cast(RIGHT(@x,2) + LEFT(@x,4) as datetime)
    
    select @d
    

    【讨论】:

      【解决方案4】:

      使用子字符串将相关部分抓取成'yyyy-mm-dd'格式,然后cast它到日期时间:

      cast(
          '20' + substring(col1,5,2) + '-' +
          substring(col1,1,2) + '-' +
          substring(col1,3,2)
          as datetime)
      

      【讨论】:

        【解决方案5】:

        MSDN 中描述了支持的日期转换样式。坏消息是mmddyy 没有样式。因此,您必须进行自定义格式化。如何完成取决于您如何导入。它是 SSIS ETL 步骤吗?它是一个单一的时间表副本吗?

        您可以直接从 T-SQL 自定义转换您指定的格式:

        declare @x varchar(6) = '010110';
        
        select dateadd(month, cast(substring(@x, 1,2) as int)-1,
            dateadd(day, cast(substring(@x,3,2) as int)-1,
            dateadd(year, cast(substring(@x,5,2) as int),'01-01-2000')));
        

        【讨论】:

          【解决方案6】:

          试试这样的:

          DECLARE @OldTable table (col1 int, col2 char(1), col3 char(6))
          DECLARE @NewTable table (col1 int, col2 char(1), col3 datetime)
          INSERT @OldTable VALUES (1,'A','010110') --mmddyy = jan  1, 2010
          INSERT @OldTable VALUES (1,'A','091710') --mmddyy = sep 17, 2010
          
          INSERT INTO @NewTable
                  (col1, col2, col3)
              SELECT
                  col1, col2, RIGHT(col3,2) + LEFT(col3,4) --<< cast to datetime not needed... 
                  FROM @OldTable                           --<< because @NewTable.col3 is datetime
                  ORDER BY Col1
          
          SELECT * FROM @NewTable
          

          输出:

          col1        col2 col3
          ----------- ---- -----------------------
          1           A    2010-01-01 00:00:00.000
          1           A    2010-09-17 00:00:00.000
          
          (2 row(s) affected)
          

          【讨论】:

            【解决方案7】:

            这适用于 6 个字符长的 varchar 字符串

            CAST((RIGHT('130513',2) + ltrim(rtrim(right(left('130513', 4), 2))) + LEFT('130513',2) ) AS DATETIME)
            

            这会将字符串转换为 2013 年 5 月 13 日

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-06-10
              • 2019-12-20
              • 1970-01-01
              • 1970-01-01
              • 2014-06-07
              • 2012-10-28
              • 2013-08-13
              相关资源
              最近更新 更多