ansi SQL Oracle 中的日期函数

ansi SQL date function in Oracle

我意识到我可以使用 to_char 和 to_date 的组合,而不是作为变通方法,但我想弄清楚为什么这不起作用。我正在使用 Oracle 12.1

 select '2016-10-01'
 from dual

union all

select to_char(2016)||'-10-01'
 from dual;

联合的每一方都产生相同的输出:2016-10-01。如果我然后尝试使用 ANSI 日期语法(如此处所述:http://blog.tanelpoder.com/2012/12/29/a-tip-for-lazy-oracle-users-type-less-with-ansi-date-and-timestamp-sql-syntax/),它只适用于第一个,而不适用于第二个:

 select date '2016-10-01'
 from dual

这个returns:10/1/2016

但如果我尝试这样做:

 select date to_char(2016)||'-10-01'
   from dual;

我上车:

ORA_00936 missing expression error.

我可以编写变通方法,但我很困惑为什么一个有效而另一个无效。

它不会那样工作,因为 DATE 不是函数而是 literal

The terms literal and constant value are synonymous and refer to a fixed data value.

Date Literals

You can specify a DATE value as a string literal, or you can convert a character or numeric value to a date value with the TO_DATE function. DATE literals are the only case in which Oracle Database accepts a TO_DATE expression in place of a string literal.

您可以使用 TO_DATE 函数。

select TO_DATE(to_char(2016)||'-10-01', 'YYYY-MM-DD')
from dual;

Rextester Demo

编辑:

使用动态-SQL:

DECLARE
  i DATE;
  stmt VARCHAR2(100);
BEGIN
  stmt := q'{SELECT  DATE '}' || TO_CHAR(2016) || '-01-01' ||  q'{' FROM dual}';

  EXECUTE IMMEDIATE stmt INTO i;
  DBMS_OUTPUT.PUT_LINE('i =>' || i);
END;