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