sql之Oracle 中的 ansi SQL 日期函数
我知道我可以使用 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
这返回: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;
编辑:
使用动态 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;
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。