sql之Oracle 中的 ansi SQL 日期函数

jpfss 阅读:20 2025-01-19 22:14:33 评论:0

我知道我可以使用 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; 

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; 


标签:oracle
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号