Edit 1:根据用户hwd的评论,我意识到据说只接受任何数据类型的函数CHAR
,VARCHAR2
,NCHAR
,NVARCHAR2
,CLOB
或NCLOB
仍然接受DATE
。
假设concat
、substr
,lower
说只接受任何数据类型CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
或NCLOB
。但以下内容仍然有效。
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
数据?
我对文档中的以下陈述感到困惑。
-CONCAT
的参数应该是任何数据类型 CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB 或 NCLOB。
-在串联操作期间,Oracle 从非字符数据类型转换为CHAR
或NCHAR
..但我觉得它在某种程度上与隐式类型转换矩阵相矛盾,因为它表明DATE
不能转换为CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
。
- 大多数 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 nls
sqlplus命令列出所有这些命令(它也应该在sqldeveloper和sqlcl中工作(。