将 TIMESTAMP 转换为 DATE 时,为什么日期减法不会产生整数?

Gif*_*guy 1 sql oracle casting date-arithmetic oracle-apex

正常的日期减法如下所示:

SELECT TO_DATE('12-29-2019') - TO_DATE('12-20-2019') FROM DUAL

/* RESULT: 9 */
Run Code Online (Sandbox Code Playgroud)

当我将 a 转换TIMESTAMP为 a 时DATE,Oracle 会截断小时/分钟/秒并生成一个“整体”DATE值。

SELECT CAST(LOCALTIMESTAMP AS DATE) FROM DUAL

/* RESULT: 12/07/2019 */
Run Code Online (Sandbox Code Playgroud)

但是当CAST从 a执行日期减法时TIMESTAMP,我不再得到整数。

SELECT TO_DATE('12-29-2019') - CAST(LOCALTIMESTAMP AS DATE) FROM DUAL

/* RESULT: 21.0999421296296296296296296296296296296 */
Run Code Online (Sandbox Code Playgroud)

在 Oracle 中将 TIMESTAMP 转换为 DATE 时,为什么日期减法不会产生整数?

Lit*_*oot 5

因为你所看到的并不是你所拥有的。

这是您的命令和结果:

SQL> SELECT CAST(LOCALTIMESTAMP AS DATE) FROM DUAL;

CAST(LOC
--------
07.12.19
Run Code Online (Sandbox Code Playgroud)

但是,那只是因为日期格式是这样设置的。

如果你改变会话并设置不同的格式,那么你会得到

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> SELECT CAST(LOCALTIMESTAMP AS DATE) FROM DUAL;

CAST(LOCALTIMESTAMP
-------------------
07.12.2019 22:44:47

SQL>
Run Code Online (Sandbox Code Playgroud)

这是完全不同的,不是吗?这就是为什么你得到十进制数的原因。TRUNC它首先删除时间组件。