sql - ORACLE 数据库如何将 DATE 隐式转换为 NUMBER?
问题描述
我试图理解这个功能:
NVL2( NULL, ( SYSDATE - SYSDATE ), DATE '2020-05-24' ))
及其返回值:
NVL2(NULL,(SYSDATE-SYSDATE),DATE '2020-05-24'))
2458994
我无法理解该数字 ,2458994
的来源,就像SYSDATE-SYSDATE
a一样NUMBER
,并且您不能将 a隐式转换DATE
为 a NUMBER
:
TO_NUMBER(DATE '2020-05-24')
ORA-01722: invalid number
如果 expr2 是数字数据,则 Oracle 数据库确定哪个参数具有最高的数字优先级,将另一个参数隐式转换为该数据类型,并返回该数据类型。
所以我的问题是,ORACLE SQL 在DATE
数据类型上使用什么形式的转换来使其成为NUMBER
数据类型?
解决方案
它有效地做:
to_number(to_char(DATE '2020-05-24','J'))
'J' 是(来自文档):
朱利安日;自公元前 4712 年 1 月 1 日以来的天数。用 J 指定的数字必须是整数。
如果您手动运行它,它将获得与您看到的相同的值:
select to_number(to_char(DATE '2020-05-24','J')) from dual;
2458994
它应该这样做并不明显,但确实如此。如果第二个参数是一个普通的(type-2)数字,那么你会得到一个错误:
select NVL2(NULL,42,to_date('2020-05-24','YYYY-MM-DD')) from dual;
ORA-00932: inconsistent datatypes: expected NUMBER got DATE
如果您转储日期减法结果,它会以不同的(内部,据我所知未记录)数据类型返回:
select dump(SYSDATE-SYSDATE) from dual;
Typ=14 Len=8: 114,133,37,0,0,0,0,0
这似乎导致第三个参数被转换为相同的类型;它几乎等同于:
select DATE '2020-05-24' - DATE '-4712-01-01' from dual;
2458993
所以看起来它要么在做类似的事情,但要对其进行调整,或者做一个内部版本的“J”转换,或者......其他一些模糊相似的事情。它似乎没有记录在案的行为。
推荐阅读
- javascript - 未捕获的类型错误:无法在“AudioContext”上执行“createMediaElementSource”:参数 1 不是“HTMLMediaElement”类型
- graphql - gatsby-source-prismic-graphql 查询结构
- c# - 如何将对象传递给复选框的 checkChanged 事件?
- java - 更新一个实体时,休眠尝试删除其他实体中的引用
- javascript - 如何使用 Google Drive API REST 下载文件?
- grep - (Windows › Cygwin › grep › Notepad++) 用空格打开 grep 找到的文件
- api - 我正在使用 POS API:Web callBack 来获取 Trans.ID,它可以工作。如何获取交易金额?
- function - 是否有一种方法可以在整个文档/环境中的所有函数调用中添加参数并更改它们?
- google-apps-script - 根据列名删除 Google 表格列
- python - 为列中的每个唯一值生成唯一列