"ORA-00936: missing expression" DATE

"ORA-00936: missing expression" on DATE

在工作中,我们正在进行从 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?感谢您的帮助!

你必须使用 -

CASE 
        WHEN YYCOL IS NULL THEN NULL 
        ELSE max ( TO_DATE ( MMCOL || '/' || DDCOL || '/' || YYCOL, 'MM/DD/YY' ) ) 
  END AS COLUMN007 

"so it only shows the date stamp" to_date 将提供的字符串转换为 oracle 内部二进制 DATE 数据类型,它也始终包括精确到秒的时间。但是对于 "show" 日期,该 DATE 类型必须转换回字符串。这通常通过使用 TO_CHAR、提供日期和 'format mask' 来完成。由于您没有提供,因此 oracle 被迫隐式执行,并使用 NLS_DATE_FORMAT 的有效值。如果只希望 "show" 日期,则

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/

上写的一篇文章

顺便说一句,请不要使用两位数的年份。 20 年前,我和成千上万像我一样的人竭尽全力防止 2000 年 1 月 1 日的崩溃。就在上周,我读了一篇文章,说从 2020 年 1 月 1 日起,用 'pivot date' 踢罐头的系统现在就要崩溃了。请停止重复我们本应在 20 年前纠正的错误。