-1

在工作中,我们正在经历从 DB2 for iSeries SQL 到 Oracle SQL 的迁移,并且正在经历一些痛苦。我仍然认为自己是 SQL 的初学者,并且无法弄清楚 Oracle SQL 不喜欢这个子句的什么地方。

  CASE 
        WHEN YYCOL IS NULL THEN NULL 
        ELSE max ( DATE ( MMCOL || '/' || DDCOL || '/' || YYCOL ) ) 
  END AS COLUMN007 

使用上述子句查询时:

ORA-00936: missing expression
            ELSE max ( DATE ( MMCOL || '/' || DDCOL || '/' || YYCOL ) ) 
                       ^

如果可能,是否有一些易于理解的文档用于从 DB2 for iSeries SQL 迁移到 Oracle SQL?任何帮助表示赞赏!

4

2 回答 2

0

你必须使用 -

CASE 
        WHEN YYCOL IS NULL THEN NULL 
        ELSE max ( TO_DATE ( MMCOL || '/' || DDCOL || '/' || YYCOL, 'MM/DD/YY' ) ) 
  END AS COLUMN007 
于 2020-01-29T19:52:09.673 回答
0

“所以它只显示日期戳” to_date 将提供的字符串转换为 oracle 内部的二进制 DATE 数据类型,它也总是包括时间到秒。但要“显示”日期,必须将 DATE 类型转换回字符串。这通常通过使用 TO_CHAR 来完成,提供一个 DATE 和一个“格式掩码”。由于您没有提供,oracle 被迫隐式执行,并使用 NLS_DATE_FORMAT 的有效值。如果希望它只“显示”日期,那么

to_char(to_date(MMCOL||'/'||DDCOL||'/'||yycol,'mm/dd/yy'),'mm/dd/yyyy')

我鼓励你去官方的 oracle 文档并查找 to_date 和 to_char 函数。另请参阅我写的一篇文章,位于https://edstevensdba.wordpress.com/2011/04/07/nls_date_format/

顺便说一句,请不要使用 2 位数的年份。20 年前,我和成千上万像我一样的人正在竭尽全力防止 2000 年 1 月 1 日的崩溃。就在上周,我读到一篇文章称,自 2020 年 1 月 1 日起,那些以“枢轴日期”结束道路的系统现在正走向悲痛。请不要再重复我们应该在 20 年前纠正的错误。

于 2020-01-29T20:40:32.990 回答