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

Why doesn't date subtraction produce whole numbers when casting TIMESTAMP to DATE?

正常的日期减法是这样的:

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

/* RESULT: 9 */

当我将 TIMESTAMP 转换为 DATE 时,Oracle 会截断 hours/minutes/seconds 并生成 "whole" DATE 值。

SELECT CAST(LOCALTIMESTAMP AS DATE) FROM DUAL

/* RESULT: 12/07/2019 */

但是当用 CASTTIMESTAMP 执行日期减法时,我不再得到整数了。

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

/* RESULT: 21.0999421296296296296296296296296296296 */

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

因为所见即所得。

这是你的命令和结果:

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

CAST(LOC
--------
07.12.19

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

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

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>

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