【问题标题】:What causes error "Strings cannot be added or subtracted in dialect 3"什么导致错误“在方言 3 中无法添加或减去字符串”
【发布时间】:2021-12-28 09:55:18
【问题描述】:

我有疑问:

WITH STAN_IND
AS (
SELECT ro.kod_stanow, ro.ind_wyrob||' - '||ro.LP_OPER INDEKS_OPERACJA, count(*) ILE_POWT
FROM M_REJ_OPERACJI ro
JOIN M_TABST st ON st.SYMBOL = ro.kod_stanow
WHERE (st.KOD_GRST starting with 'F' or (st.KOD_GRST starting with 'T')  )  AND ro.DATA_WYKON>'NOW'-100
GROUP BY 1,2)

SELECT S.kod_stanow, count(*) ILE_INDEKS, SUM(ILE_POWT-1) POWTORZEN
from STAN_IND S
GROUP BY S.kod_stanow
ORDER BY ILE_INDEKS

这应该可以工作,但我收到一个错误:

SQL 错误 [335544606] [42000]:动态 SQL 错误;不支持表达式评估;方言3中不能加减字符串【SQLState:42000,ISC错误码:335544606】

我尝试将其转换为更大的 varchar,但仍然没有成功。这里有什么问题?数据库是 Firebird 2.1

【问题讨论】:

  • 请提供一个minimal reproducible example,其中包括 DDL、测试数据和要执行的完整查询,该查询会产生错误。乍一看,您的查询对我来说看起来不错,但错误表明您在字符串之间使用 -+,这似乎不会在显示的代码中发生(除非此查询可能包含在字符串中文字并使用 PSQL 中的EXECUTE STATEMENT 执行)。
  • 您的问题可能是'NOW'-100,但我现在无法验证。使用 CAST('NOW' as TIMESTAMP) - 100CURRENT_TIMESTAMP - 100(或转换为 DATE 或使用 CURRENT_DATE 如果列 DATA_WYKONDATE)。文字 'NOW' 本身不是日期/时间戳,只有与日期或时间戳列比较时才会表示,而这里的减法发生在该点之前。
  • CAST('NOW' as TIMESTAMP) - 100 完成了这项工作,谢谢
  • 感谢您的确认,我根据我的评论写了一个答案。

标签: sql firebird firebird2.1


【解决方案1】:

您的问题是'NOW'-100。文字 'NOW' 本身不是日期/时间戳,而是 CHAR(3) 文字。只有当与(或分配给)日期或时间戳列进行比较时,它才会被转换,并且减法发生在该点之前。并且减法失败,因为未定义字符串文字的减法。

使用CAST('NOW' as TIMESTAMP) - 100CURRENT_TIMESTAMP - 100(或转换为DATE 或使用CURRENT_DATE,如果DATA_WYKON 列是DATE)。

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多