【问题标题】:Subtract concatenated dates with CASE用 CASE 减去连接的日期
【发布时间】:2016-07-29 20:40:28
【问题描述】:

在选择语句中,我想减去连接日期以确定 OEM 保修标志。我收到错误 ORA-00920:无效的关系运算符。 我在这里错过了什么?

--OEM WARRANTY FROM MFG SERIAL AND RECV DATE
CASE WHEN TO_CHAR(a.RECV_DATE, 'MM/DD/YY') -
TO_CHAR(CASE 
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'A' THEN '01'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'B' THEN '02'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'C' THEN '03'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'D' THEN '04'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'E' THEN '05'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'F' THEN '06'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'G' THEN '07'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'H' THEN '08'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'J' THEN '09'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'K' THEN '10'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'L' THEN '11'
WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'M' THEN '12'
ELSE 'FIRST CHAR OF MFG SERIAL INCORRECT' END
||'/' || SUBSTR(a.CARD_RECV_SERIAL_NBR, 10, 2) ||'/'|| SUBSTR(a.CARD_RECV_SERIAL_NBR, 2, 2)), 'MM/DD/YY')
> '365' THEN 'N' ELSE 'Y'
END AS "OEM WARR"

【问题讨论】:

  • 请不要将您的问题标题全部大写。就像互联网上的其他任何地方一样,输入全部大写被认为是大喊大叫。没有必要在这里大喊大叫;我们都是非常好的读者。大喊不会让你更快地得到答案,它会使文本更难阅读,而且相当粗鲁和烦人。没有理由在这里大喊大叫来引起注意 - 如果有人可以帮助您,他们会在没有大写字母的情况下帮助您。
  • @mathguy:是的。同时我做到了。您错过了删除标签信息。我的评论仍然有效;应该让张贴者意识到这是不恰当的行为。
  • 我总是用全部大写来编写我的脚本,并且觉得它更容易阅读,这是一个见仁见智的问题。我不打算以任何方式大喊大叫或粗鲁,并认为阅读这个论坛的人会“明白”,但显然不是。顺便说一句,大写的唯一帖子是我的代码。当您在编写代码时在智能感知中使用制表符功能时,它默认为全部大写。停止(大喊)拖钓。
  • 你的整个标题都是大写字母(我编辑删除)。我可以支持您选择编写脚本的方式;我只是要求您不要用全部大写字母输入您的问题title。停止刻薄并(学会)接受建设性的建议。试图提供帮助并解释网站礼仪不是拖钓
  • 我会把你指向help center,它解释了这个网站是由它的用户管理的,而且这里可以接受的行为不包括人身侮辱或辱骂。请有礼貌。如果您对此处的标准和行为期望感到不快,请随时在其他地方提出您的问题。

标签: oracle oracle10g


【解决方案1】:

您正在创建两个字符串(使用TO_CHAR()),然后从另一个中减去一个,然后与字符串“365”进行比较?你认为如何从另一个中减去一个 STRING?

您可能打算将它们设为TO_DATE() - 然后将差异与数字365 进行比较,而不是字符串'365'

【讨论】:

    【解决方案2】:

    对我来说最明显的事情是当您实际上想要减去日期时尝试减去字符串。也许是这样的:

    CASE WHEN a.RECV_DATE -
    TO_DATE(
      CASE WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'A' THEN '01'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'B' THEN '02'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'C' THEN '03'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'D' THEN '04'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'E' THEN '05'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'F' THEN '06'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'G' THEN '07'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'H' THEN '08'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'J' THEN '09'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'K' THEN '10'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'L' THEN '11'
           WHEN SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1) = 'M' THEN '12'
      END || '/' || SUBSTR(a.CARD_RECV_SERIAL_NBR, 10, 2) ||'/'|| 
                    SUBSTR(a.CARD_RECV_SERIAL_NBR, 2, 2)), 'MM/DD/YY') > 365 
      THEN 'N' ELSE 'Y' END as "OWM WARR"
    

    (未测试)

    至于错误消息,我认为您不能在纯 SQL 上下文中执行此操作。这是 PL/SQL 程序的一部分吗?如果不是,那么您可能应该在 WHERE 子句中将数据限制为有效月份。

    更紧凑:

    CASE WHEN a.RECV_DATE -
       TO_DATE(DECODE(SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1), 
       'A','01', 'B','02', 'C','03', 'D','04', 'E','05', 'F','06'
       'G','07', 'H','08', 'J','09', 'K','10', 'L','11', 'M','12')
       || '/' || SUBSTR(a.CARD_RECV_SERIAL_NBR, 10, 2) ||'/'|| 
                 SUBSTR(a.CARD_RECV_SERIAL_NBR, 2, 2)), 'MM/DD/YY') > 365 
    THEN 'N' ELSE 'Y' END as "OWM WARR"
    

    【讨论】:

    • 谢谢 DCookie。我对您的精简版本进行了一些语法更新并让它工作。我是一名学习 Oracle 的 SQL Server 人员,所以这非常有帮助!这是我最终得到的结果:
    【解决方案3】:

    成功了!

    --MANUFACTURER DATE
    --DECODE MFG SERIAL MONTH
    TO_DATE(DECODE(SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1), 
    'A','01', 'B','02', 'C','03', 'D','04', 'E','05', 'F','06',
    'G','07', 'H','08', 'J','09', 'K','10', 'L','11', 'M','12')
    || '/' || SUBSTR(a.CARD_RECV_SERIAL_NBR, 10, 2) ||'/'|| 
    SUBSTR(a.CARD_RECV_SERIAL_NBR, 2, 2), 'MM/DD/YYYY') AS "MFG DATE",
    ---------------------------------------------------------------------
    --OEM WARRANTY FROM MFG SERIAL AND RECV DATE
    CASE WHEN a.RECV_DATE -
    TO_DATE(DECODE(SUBSTR(a.CARD_RECV_SERIAL_NBR, 1, 1), 
    'A','01', 'B','02', 'C','03', 'D','04', 'E','05', 'F','06',
    'G','07', 'H','08', 'J','09', 'K','10', 'L','11', 'M','12')
    || '/' || SUBSTR(a.CARD_RECV_SERIAL_NBR, 10, 2) ||'/'|| 
    SUBSTR(a.CARD_RECV_SERIAL_NBR, 2, 2), 'MM/DD/YYYY') > 365 
    THEN 'N' ELSE 'Y' END as "OEM WARR"
      ---------------------------------------------------------------------
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2012-08-21
      • 1970-01-01
      • 2022-01-21
      • 2015-08-04
      • 1970-01-01
      相关资源
      最近更新 更多