【问题标题】:ansi SQL date function in OracleOracle中的ansi SQL日期函数
【发布时间】:2017-10-03 16:23:45
【问题描述】:

我意识到我可以使用 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

返回:2016 年 10 月 1 日

但如果我试试这个:

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

我上车:

ORA_00936 缺少表达式错误。

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

【问题讨论】:

  • date 是定义日期常量的关键字。你没有跟随它的常量。

标签: sql oracle to-date


【解决方案1】:

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

字面量和常量值是同义词,指的是固定的数据值。

日期文字

您可以将 DATE 值指定为字符串文字,也可以使用 TO_DATE 函数将字符或数值转换为日期值。 DATE 文字是 Oracle 数据库接受 TO_DATE 表达式代替字符串文字的唯一情况。

你可以使用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;

【讨论】:

  • 如果他使用子查询或括号不会起作用吗?
  • Rextester 说不哈哈。
  • 好点,我正在清理我的问题,它绝对不是一个函数。我确实尝试在整个事情周围加上括号(例如: date (to_char(2016)||'-10-01') ),但这也没有用,我认为可以。我很欣赏 to_date 和您提供的解决方案,但我更多是出于好奇而询问;看来我工会的双方都可以工作。我现在用不同的方式编码。
  • @fleetmack 关键是这个字面量是用于fixed data value。我会准备动态演示
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 2012-04-05
  • 2013-11-27
  • 2010-12-20
  • 1970-01-01
  • 2023-04-03
  • 2022-09-30
  • 2015-03-15
相关资源
最近更新 更多