【问题标题】:Msg 242, Level 16, State 3, Line 12 The conversion of a varchar data type to a datetime data type resulted in an out-of-range value消息 242,级别 16,状态 3,第 12 行将 varchar 数据类型转换为 datetime 数据类型导致值超出范围
【发布时间】:2020-07-24 15:24:44
【问题描述】:

查询返回错误:

DECLARE @x VARCHAR(200);

--SELECT @x = '13/12/2019 16:01:47'
SELECT @x = '-'

select  CASE WHEN ISDATE(@x)=1 THEN CONVERT(datetime, @x)  else case when @x='-' then '-' else CONVERT(CHAR(10),CONVERT(DATETIME,LEFT(@x,10),105),101) END END; 

如果我运行这个查询,它工作正常:

DECLARE @x VARCHAR(200);

SELECT @x = '13/12/2019 16:01:47'
--SELECT @x = '-'

 select  CASE WHEN ISDATE(@x)=1 THEN CONVERT(datetime, @x)  else case when @x='-' then '-' else CONVERT(CHAR(10),CONVERT(DATETIME,LEFT(@x,10),105),101) END END; 

也试过这个查询:

SELECT case when @x = '-' then '-' 
            WHEN ISDATE(@x)=1 THEN CONVERT(datetime, @x)  
            else  CONVERT(CHAR(10),CONVERT(DATETIME,LEFT(@x,10),105),101) 
        END 

我不明白如何处理 case 语句中的“-”。在我看来一切都很好。我需要检查case语句中的条件。

【问题讨论】:

  • SQL Server 没有类似 try_cast 的东西吗?
  • 我们来看最后一条使用CASE的语句。 CASE 是一个表达式,它返回一个特定的单一数据类型的值。您不能根据条件同时返回字符串 ('-') 和日期时间值。您必须确定所需的数据类型,然后编写代码以根据需要转换所有不同的可能性。这闻起来像是一个很大的XY problem,你可能应该重新考虑你的目标和让你走上这条道路的决定。

标签: sql sql-server sql-server-2008


【解决方案1】:

使用TRY_CONVERT():

SELECT TRY_CONVERT(datetime, @x),
       COALESCE(TRY_CONVERT(VARCHAR(10), TRY_CONVERT(DATETIME, LEFT(@x, 10), 105), 101), '-')

我看不出转换回字符串有什么好处。

【讨论】:

  • 它在关键字“CONVERT”附近给出错误语法错误。
猜你喜欢
  • 2011-11-12
  • 2016-02-08
  • 1970-01-01
  • 2014-01-17
  • 2017-03-29
相关资源
最近更新 更多