我得到了一个名为'FechasFirmaHorometros'的视图,定义为
SELECT IdFormulario,
CONVERT(Date, RValues) AS FechaFirma
FROM dbo.Respuestas
WHERE ( IdPreguntas IN (SELECT IdPregunta
FROM dbo.Preguntas
WHERE
( FormIdentifier = dbo.IdFormularioHorometros() )
AND ( Label = 'SLFYHDLR' )) )
我有一个名为[RespuestaPreguntaHorometrosFecha]的函数定义为
SELECT Respuestas.RValues
FROM Respuestas
JOIN Preguntas
ON Preguntas.Label = @LabelPregunta
JOIN FechasFirmaHorometros
ON FechasFirmaHorometros.IdFormulario = Respuestas.IdFormulario
WHERE Respuestas.IdPreguntas = Preguntas.IdPregunta
AND YEAR(FechasFirmaHorometros.FechaFirma) = @Anio
AND MONTH(FechasFirmaHorometros.FechaFirma) = @Mes
@LabelPregunta VARCHAR(MAX)
@Anio INT
@Mes INT
在调试使用它的另一个存储过程
时,我在点击上述函数时不断收到此消息Conversion failed when converting date and/or time from character string.
然而,我可以自由地做像
这样的事情SELECT DAY(FechaFirma) FROM FechasFirmaHorometros
为什么会发生这种情况,我该如何解决或解决它?
答案 0 :(得分:5)
由于某种原因,我假设RValues
是某种类型的字符串列。你应该使用日期数据类型来修复它并存储日期数据(显然在这个混合包中的一个单独的列中)。
如果你无法解决这个问题,那么你可以通过以下方式阻止Damien所描述的内容:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(如果SQL Server无法弄清楚如何将其转换为日期,那将使“日期”NULL
。)
您无法通过添加WHERE
子句来阻止这种情况,因为SQL Server通常会在执行过滤器之前尝试在SELECT
列表中尝试转换(所有这些都取决于计划)。您也无法使用子查询,CTE,连接顺序提示等强制操作顺序。There is an open Connect item about this issue - they are "aware of it" and "hope to address it in a future version。“
没有CASE表达式,它迫使SQL Server在尝试转换(as long as no aggregates are present in any of the branches)之前评估ISDATE()结果,你可以:
使用TRY_CONVERT()
因为我刚刚注意到你在SQL Server 2012上:
TRY_CONVERT(DATE, RValues) AS FechaFirma