【问题标题】:Error when converting varchar to date ddmmyyyy将 varchar 转换为日期 ddmmyyyy 时出错
【发布时间】:2020-09-07 13:58:09
【问题描述】:

我有一个 varchar 列,其格式为 ddmmyyyy,我正在尝试将其转换为 dd-mm-yyyy 格式的日期。我正在使用下面的查询,但出现错误:

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

select *, coalesce(try_convert(date, newdate, 105), convert(date, newdate)) 
from mydate

【问题讨论】:

标签: sql sql-server string tsql date


【解决方案1】:

你没有日期,你有一个字符串。所以,你可以使用字符串操作:

select stuff(stuff(newdate, 5, 0, '-'), 3, 0, '-')

如果你想转换为日期,你可以这样做:

select convert(date, concat(right(newdate, 4), substring(newdate, 3, 2), left(newdate, 2)))

然后,您可以根据需要对其进行格式化。

但是,您不应该将值转换为日期。您应该首先将其存储为日期。

【讨论】:

    【解决方案2】:

    要将你的字符串变成日期,你可以[try_]cast()它; SQL Server 通常足够灵活,可以自行确定格式:

    try_cast(newdate as date)
    

    如果要将其转回目标格式的字符串,则可以使用format()

    format(try_cast(newdate as date), 'dd-MM-yyyy')
    

    与纯字符串操作相比,try_cast()/format() 方法的优势在于它验证字符串是否为流程中的有效日期。

    【讨论】:

      【解决方案3】:

      必须同意其他人。为什么首先将日期存储为字符串?以非标准格式,不少于?这是一种方法,但您应该真正修复数据模型。将日期存储为日期。

      DECLARE @badIdea table (dt char(8));
      
      INSERT @badIdea(dt) VALUES('21052020');
      
      SELECT newdate = TRY_CONVERT(date, RIGHT(dt,4) + SUBSTRING(dt,3,2) + LEFT(dt,2))
        FROM @badIdea;
      

      BTW 105 不起作用,因为它需要破折号。这有效:

      SELECT CONVERT(date, '21-05-2020', 105);
      

      恕我直言,这也是一种糟糕的格式,因为谁知道07-08-2020 是 7 月 8 日还是 8 月 7 日。但至少 SQL Server支持这个。您当前的选择不是。

      【讨论】:

        【解决方案4】:

        SQL 不会以不同的格式存储日期数据类型,尝试调整这一点可能不是一个好主意。

        但是,如果您希望结果集以不同的格式简单地显示日期,那么您就在正确的轨道上。您只需要将日期数据类型转换为字符串。

        SELECT  *
                , COALESCE ( TRY_CONVERT ( CHAR(10), newdate, 105 ), CONVERT ( CHAR(10), newdate ) ) 
        FROM    mydate
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-10
          • 1970-01-01
          • 2014-06-07
          • 1970-01-01
          • 1970-01-01
          • 2013-01-15
          • 2013-02-05
          • 1970-01-01
          相关资源
          最近更新 更多