【问题标题】:Conversion failed when converting date and/or time from character string month(),year()从字符串月(),年()转换日期和/或时间时转换失败
【发布时间】:2015-04-01 07:30:18
【问题描述】:

我有这些数据:

Col1             Col2  Col3
2014-12-31        Q     
2014-12-10        Q


CREATE TABLE Persons
(
    Col1 varchar(50),
    Col2 varchar(50),
    Col3 varchar(20)
); 

INSERT INTO Persons(Col1, Col2,Col3) 
VALUES ('2014-12-20', 'Q','');

INSERT INTO Persons(Col1, Col2,Col3) 
VALUES ('2014-12-10', 'Q','');

我运行这个查询:

select 
  convert(date, Col1,104) as Col1,
  Col2,
  case when Col2 = 'Q' then convert(nvarchar(10),year(Col1)+'Q0')
  end as Col3
from Persons

我收到此错误:

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

【问题讨论】:

  • 你的意思是year(Col4)而不是year(Col1)吗?
  • 有什么理由不使用date?避免转换问题的最佳方法是使用正确的类型。
  • 是的,对不起,我修好了。
  • 另外,104 是 German 格式 dd.mm.yyyy。表示日期的最安全的字符串格式是 未分隔的 ISO 格式 yyyymmdd。样式代码为 112。
  • 您的问题从您决定将日期存储在 nvarchar 列中开始和结束。为您的数据使用正确的数据类型,您的问题就会得到解决。

标签: sql sql-server


【解决方案1】:
DECLARE  @P TABLE
(

    Col1 varchar(50),
    Col2 varchar(50),
    Col3 varchar(20)
) 

  INSERT INTO @P(Col1, Col2,Col3)    
  VALUES ('2014-12-20', 'Q','');

  INSERT INTO @P(Col1, Col2,Col3)    
  VALUES ('2014-12-10', 'Q','');

select 
  convert(varchar(10), Col1,104) as Col1,
  Col2,
  case when Col2 = 'Q' then
    RIGHT(convert(nvarchar(10),year(Col1),106),5) + 'Q0'
  end as Col3    
from @P

输出:

【讨论】:

  • 请正确格式化您的答案。要输入代码,只需在开头添加四个空格。另外,这与所有其他答案有何不同?
  • 编辑后,我看到您将文本转换为日期,而是将 varchar(50) 字段转换为 varchar(10) 字段。我怀疑这就是OP想要的。无论如何,您不需要使用转换,只需按原样返回Col1。使用样式将year(int)的结果转换为varchar也是一个noop。一个简单的 cast(year(Col1) as varchar(4)) 就足够了
【解决方案2】:

您的错误是由以下原因引起的:

  1. convert(date, Col1, 104)

请注意,104dd.mm.yyyy'2014-12-20' 会报错:

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

您需要先将cast 发送至date,然后将convert 发送至varchar

SELECT CONVERT(VARCHAR(10), CAST('2014-12-20' AS DATE), 104)

输出:20.12.2014

  1. convert(nvarchar(10),year(Col1)+'Q0')

您应该先将year(Col1) 转换为varchar,然后再连接'Q0'

您的最终查询应该是:

SELECT
    CONVERT(NVARCHAR(10), CAST(Col1 AS DATE), 104) AS Col1,
    Col2,
    CASE 
        WHEN Col2 = 'Q' THEN CONVERT(NVARCHAR(10), CONVERT(NVARCHAR(4), YEAR(Col1)) + 'Q0')
    END AS Col3
FROM Persons

您还应该先将Col1 转换为DATE,然后再调用YEAR()。如 cmets 中所述,当您决定将日期存储在 nvarchar 列中时,问题就开始了。如果 Col1 是无效日期,CASTDATE 仍然会出错。

【讨论】:

  • 我之前写的这个查询怎么样:select convert(date, Col1,104) as Col1, Col2, case when Col2 = 'Q' then case when month(Col1) in (10,11, 12) 然后 convert(nvarchar(10),year(Col1)+'Q0') 以来自 Persons 的 Col3 结束
【解决方案3】:

我发现有 2 个问题。第一个是从 varchar 转换为具体的日期格式。首先,仅将其转换为日期格式。然后使用具体格式。 问题 2 在 Col3 中。首先,您必须在 varchar 上转换年份,然后将 + 与字符串一起使用。 解决方案:

select 
  CONVERT(DATE,convert(date, Col1),104) as Col1,
  Col2,
  case when Col2 = 'Q' then convert(nvarchar(10),year(Col1))+'Q0'
  end as Col3
from Persons

select 
  CONVERT(DATE,convert(date, Col1),104) as Col1,
  Col2,
  case when Col2 = 'Q' then convert(nvarchar(10),year(Col1))+'Q0'
  end as Col3
from Persons
WHERE isdate(Col1) = 1

【讨论】:

  • 这将如何改变任何事情? 104 是点分隔的德式风格。如果第一次转换有效,那么第二次转换的意义何在?
  • 认为列的类型是 varchar 我弄错了。
  • 或者你可以使用 cast,用于回答 wewestthemenace
  • convert(date, Col1,104) as Col1 仅适用于 Col1。我已经尝试了所有解决方案,但出现错误。
  • 是的,我也只运行 select CONVERT(NVARCHAR(10), CAST(Col1 AS DATE), 104) AS Col1 并给我错误:从字符转换日期和/或时间时转换失败字符串
猜你喜欢
  • 2012-04-17
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多