当前位置: 首页 > 面试题库 >

为什么YEAR会因日期转换错误而失败?

夏侯英纵
2023-03-14
问题内容

我有一个名为“ 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

为什么会发生这种情况,我该如何解决或解决呢?


问题答案:

RValues由于某种原因,我认为这是某种类型的字符串列。您应该解决该问题,并使用日期数据类型存储日期数据(显然,此数据包与混合包位于不同的列中)。

如果您无法解决该问题,则可以通过以下方法阻止Damien所说的事情:

CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma

NULL如果SQL Server无法确定如何将其转换为日期,则将使用“日期” 。)

您不能仅仅通过添加一个WHERE子句来阻止这种情况,因为SQL
Server经常会SELECT在执行过滤器之前尝试尝试列表中的转换(这完全取决于计划)。您也不能通过使用子查询,CTE,联接顺序提示等来强制执行操作顺序。关于此问题,有一个打开的Connect项-
他们“意识到”并且“希望在以后的版本中解决它”
。”

如果缺少CASE表达式,它将迫使SQL
Server在尝试进行转换之前评估ISDATE()结果(只要任何分支中都没有聚合),您可以:

  • 将过滤后的结果转储到#temp表中,然后从该#temp表中进行选择,然后仅应用转换。
  • 只需返回字符串,并将其视为客户端上的日期,然后从中取出YEAR / MONTH等部分
  • 只需使用字符串操作即可拉YEAR = LEFT(col,4)等。
  • 使用,TRY_CONVERT()因为我刚刚注意到您使用的是SQL Server 2012:
    TRY_CONVERT(DATE, RValues) AS FechaFirma
    


 类似资料:
  • 我在让Spark Cassandra连接器在Scala中工作时遇到问题。 我正在使用这些版本: 斯卡拉 2.10.4 火花芯 1.0.2 卡桑德拉-节俭 2.1.0 (我安装的卡桑德拉是 v2.1.0) cassandra-clientutil 2.1.0 卡桑德拉驱动器核心 2.0.4 (推荐用于连接器? 火花-卡桑德拉-连接器 1.0.0 我可以连接并与卡桑德拉(没有火花)交谈,我可以与火花(

  • 问题内容: 我想知道为什么在引用“ w”之后会引发错误。您不是通过说obj = w来创建另一个指向该w实例的指针吗?也就是说,为什么与说谢谢一样呢? 问题答案: 没有什么比早上引用JLS更重要。 JLS 6.3。宣言的范围: 块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。 和 JLS 14.2 方块:

  • 问题内容: 前三行工作正常。当我再次尝试将字符串解析为日期时,出现错误。我该如何解决? 错误看起来像这样: 问题答案: 为我工作。在模式末尾使用“ SSSZ”而不是“ SZ”。

  • 我需要替换 我用了 但它抛出异常 java.lang.IllegalArgumentException: Illegal group reference

  • 问题内容: 我正在使用 其中的字符串是格式。 例如,如果是40/02/2013,我将获得一个错误,而parse方法将返回Date 2013年3月12日(12/03/2013)。我在抱怨什么? 问题答案: 设置宽大处理位: 指定日期/时间解析是否宽松。使用宽大的解析,解析器可以使用试探法来解释与该对象的格式不完全匹配的输入。在严格分析的情况下,输入必须与该对象的格式匹配。 如下代码: 给出: 笔记

  • 正如我在标题中所述,我只是不明白为什么这个函数会抛出<code>std::bad_alloc</code>。如果我们看一看cppreference,所有三种可能的实现都是如有人所假设的,并且看起来没有特别需要动态内存分配。