为什么在字符函数中使用“DATE”数据类型有效?

How come it Is valid to use `DATE` data type in Character functions?

编辑 1:根据用户 hwd 的评论,我实现了据说只接受任何数据类型的函数 CHARVARCHAR2NCHARNVARCHAR2CLOBNCLOB 仍在接受 DATE

假设 concat , substr,lower 表示仅接受任何数据类型 CHAR, VARCHAR2, NCHAR, NVARCHAR2CLOBNCLOB。但以下仍然有效。

select concat('xyz',to_date('25-07-17')) from dual;
select substr(sysdate,1,5) from dual;
select lower(sysdate) from dual;

编辑 1 之前:

问题:SYSDATE 是否在 CONCAT 期间隐式转换为 CLOB 数据?

我对文档中的以下陈述感到困惑。

-Parameters of CONCAT should be any of the datatypes CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, or NCLOB.

-During concatenation operations, Oracle converts from noncharacter datatypes to CHAR or NCHAR..But I feel it some way contradicts Implicit Type Conversion Matrix 因为它显示 DATE 无法转换为 CHARVARCHAR2NCHARNVARCHAR2.

-Most SQL character functions are enabled to accept CLOBs as parameters.

所以我想知道 concat('xyz',sysdate) 如何有效? sysdate 转换成什么数据类型?

what data type is sysdate converted to?

您可以使用 dump() 函数推断数据类型,该函数发出输入的数据类型:

SQL> alter session set nls_date_format='dd-mm-yy';

Session altered.

SQL> select dump(concat('xyz',to_date('25-07-17'))) from dual;

DUMP(CONCAT('XYZ',TO_DATE('25-07-17')))
--------------------------------------------------------------------------------
Typ=1 Len=11: 120,121,122,50,53,45,48,55,45,49,55

由于 concat 正在生成数据类型 1 VARCHAR2,因此必须将日期值强制转换为 VARCHAR2。

link 的 Table 2-10 清楚地表明 DATE 可以强制转换为 CHAR、NCHAR、VARCHAR2 和 NVARCHAR2。矩阵中的 'X' 值表示 X can be implicitly converted to Y.

转换主要通过会话参数 NLS_DATE_FORMAT 实现。但是您可以使用 show parameter nls sqlplus 命令列出所有这些命令(它也应该在 sqldeveloper 和 sqlcl 中工作)。