sql - Oracle 中的 ansi SQL 日期函数

标签 sql oracle to-date

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

关于sql - Oracle 中的 ansi SQL 日期函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46549237/

相关文章:

php - Laravel 查询生成器选择空输入

mysql - 如何使用mysql查询转置mysql表数据?

oracle - 根据列值创建多列约束

sql - 检查开始/结束日期的约束

sql - postgresql 中的 to_date 函数如何工作?

mysql - 在临时表中使用 where 子句

mysql - 左加入学说 2

sql - 为什么我无法在临时表上创建索引?

sql - 为什么这个查询在转换 to_date 时不会失败

sql - TO_DATE 问题