为什么在字符函数中使用"DATE"数据类型是有效的?



Edit 1:根据用户hwd的评论,我意识到据说只接受任何数据类型的函数CHARVARCHAR2NCHARNVARCHAR2CLOBNCLOB仍然接受DATE

假设concatsubstrlower说只接受任何数据类型CHARVARCHAR2NCHARNVARCHAR2CLOBNCLOB。但以下内容仍然有效。

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

编辑 1 之前:

问:SYSDATECONCAT期间是否隐式转换为CLOB数据?

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

-CONCAT的参数应该是任何数据类型 CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB 或 NCLOB。

-在串联操作期间,Oracle 从非字符数据类型转换为CHARNCHAR..但我觉得它在某种程度上与隐式类型转换矩阵相矛盾,因为它表明DATE不能转换为CHARVARCHAR2NCHARNVARCHAR2

- 大多数 SQL 字符函数都启用了接受 CLOB 作为参数。

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

sysdate 转换为什么数据类型?

您可以使用 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。

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

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

最新更新