Sql 从字符串month()、year()转换日期和/或时间时,转换失败

Sql 从字符串month()、year()转换日期和/或时间时,转换失败,sql,sql-server,Sql,Sql Server,我有这些数据: 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',''); INSE

我有这些数据:

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
我得到这个错误:

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


您的错误是由以下原因造成的:

  • convert(日期,第104列)
  • 请注意,
    104
    dd.mm.yyyy
    <代码>'2014-12-20'将导致错误:

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

    您需要先将
    转换为
    日期,然后将
    转换为
    varchar

    SELECT CONVERT(VARCHAR(10), CAST('2014-12-20' AS DATE), 104)
    
    其输出:
    20.12.2014

  • convert(nvarchar(10),年份(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
    


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

    我发现有两个问题。第一个是从varchar转换为具体的日期格式。首先,仅将其转换为最新格式。然后使用具体的格式。 第二题在第三栏。首先必须在varchar上转换year,然后将+与字符串一起使用。 解决方案:

    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
    

    输出:


    您是指
    年(第4列)
    而不是
    年(第1列)
    ?您不使用
    日期的原因是什么?避免转换问题的最佳方法是使用正确的类型。是的,很抱歉,我已修复它。此外,104是德语格式
    dd.mm.yyyy
    。表示日期的最安全字符串格式是未分离的ISO格式
    yyyymmdd
    。样式代码是112。您的问题从您决定将日期存储在nvarchar列开始到结束。为您的数据使用适当的数据类型,您的问题就会得到解决。这将如何改变任何事情?104是点分隔的德国风格。如果第一个转换工作,第二个转换的要点是什么?考虑到列的类型是VARCHAR,我犯了一个错误。或者您可以使用CAST,用于WeWeeStEnEnCeNVRET(日期,COL104)的COL1的回答,只用于COL1。我已尝试了所有解决方案,但出现了一个错误。是的,我仅将select CONVERT(NVARCHAR(10)、CAST(Col1 AS DATE)、104)作为Col1运行,并给出错误:从字符串转换日期和/或时间时转换失败。请适当格式化您的答案。要输入代码,只需在开头添加四个空格。另外,这与所有其他答案有何不同?编辑后,我发现您没有将文本转换为日期,而是将varchar(50)字段转换为varchar(10)字段。我怀疑那是OP想要的。无论如何,您不需要使用convert,只需按原样返回
    Col1
    。使用样式将
    year
    (int)的结果转换为varchar也是一种noop。一个简单的cast(year(Col1)为varchar(4)),我之前写的这个查询怎么样:选择convert(date,col1104)为Col1,Col2,case when Col2='Q',然后case when month(Col1)in(10,11,12),然后convert(nvarchar(10),year(Col1)+'Q0')结束为Persons的Col3
    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
    
    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