【问题标题】:TO_ CHAR in oracle预言机中的 TO_CHAR
【发布时间】:2020-05-23 15:24:36
【问题描述】:

我正在使用 oracle 11G,我知道 TO_CHAR 用于将数据转换为字符,此查询将完美地获取特定日期的日期:

SELECT TO_CHAR (DATE '2019-08-15', 'Day') FROM DUAL;

但这行不通:

SELECT TO_CHAR (DATE '15-08-2019', 'Day') FROM DUAL;  

错误:ORA-01847:一个月中的某天必须介于 1 和该月的最后一天之间

SELECT TO_CHAR (DATE '15-aug-19', 'Day') FROM DUAL; 

错误:ORA-01843:不是有效月份

为什么以上行不通。我检查了 NLS_DATE_FORMAT 它显示“DD-MON-RR”。但在第一个查询中,它是“YYYY-MM-DD”。

我在这里错过了什么?

【问题讨论】:

  • 这是因为语法中的“撇号”,我已经编辑它现在可以工作了
  • 查看date literals 的 SQL 手册。当您在那里时,请注意其他信息,例如时间戳和时间间隔。

标签: sql oracle to-char


【解决方案1】:

因为YYYY-MM-DDdate'YYYY-MM-DD' 中相对于ANSI 92 SQL 标准的字符串文字格式。

对于其他格式类型,需要显式转换,如to_date('15-08-2019','dd-mm-yyyy')

【讨论】:

  • 那么这是如何工作的select to_char(sysdate,'day')from dual; sysdate 给出“dd,mm,yy”格式
  • @johnjo sysdate 是 oracle 的伪列,它返回当前日期。 sysdate 与问题中的其他示例不同。
  • 'YYYY-MM-DD' 不是默认值,它是 ANSI 标准和 Oracle docementation 指定的必需且唯一的格式。
  • 所以我猜 to_date 我们可以使用任何日期格式,根据日期格式我们可以像这样输入“ddmmyy” to_date('12-2019-19' ,'mm-yyyy-dd') 用于 to_char , truc, next_day 等以及我们需要使用的所有其他日期格式 (date 'year-month-day',yyyy,mm, dd) 所以这是文字字符串的格式。我说的对吗?
  • @johnjo 完全正确,你是对的。甚至尝试不使用标点符号,因为 to_date('12201919','mmyyyydd') 等于 date'2019-12-19'
【解决方案2】:

此问题纯粹是由于您的 NLS 设置造成的。如果你运行下面的查询,你可以看到你的数据库当前的 NLS 参数值

SELECT * FROM NLS_DATABASE_PARAMETERS

如果您想更改日期的 nls 参数,请在查询下方运行

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYYY';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2019-04-14
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多