繁体   English   中英

Oracle - 计算两个日期之间的天数

[英]Oracle - calculate number of days between two date

我有两个日期字段,第一个 date_from 和 date_to。

如果我需要在 date_from 和 date_to 中缺勤(假期)一天,我会输入例如。 系统日期

这个日期我不会工作。

尝试计算时:

Select (trunc(sysdate) - to_date(sysdate,'dd.mm.yyyy.'))  as vacation_days from dual  

得到结果 0,查询工作正常,但实际上我需要结果 1。

如果我需要从 sysdate 到 sysdate + 2 的假期,这是 3 天,但查询返回 2 天。

Select (trunc(sysdate + 2) - to_date(sysdate,'dd.mm.yyyy.'))  as Total from dual


Select trunc(sysdate) from dual  --20.04.2021.
Select trunc(sysdate + 1) from dual  --21.04.2021.
Select trunc(sysdate + 2) from dual  --22.04.2021.

我不知道如果总是在 date_to 中将日期提高一天(这一天我会工作)是多么聪明。

在这种情况下 date_from 是我不工作的日期 date_to 是我工作的日期。

Don't use TO_DATE on a DATE data type as the TO_DATE function takes a string as the first argument so Oracle will implicitly convert the DATE value to a string and then try to convert it back and this will fail if the format model for the implicit转换不同于作为TO_DATE function 的第二个参数给出的格式 model (或者,更糟糕的是,它不会失败,但会交换天、月或年参数)。

例如:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT (trunc(sysdate + 2) - to_date(sysdate,'dd.mm.yyyy.'))  as Total
from dual;

错误:

 ORA-01861: literal does not match format string

但是使用不同的隐式日期格式运行相同的查询:

ALTER SESSION SET NLS_DATE_FORMAT = 'YY.MM.DD';
SELECT (trunc(sysdate + 2) - to_date(sysdate,'dd.mm.yyyy.'))  as Total
from dual;

输出:

 | TOTAL | | -----: | | 730853 |

这不是您想要的,因为它已将日期隐式格式化为年、月、日,然后将其读回预期日、月和 4 位数年,并获得日期21-04-0020而不是20-04-2021 ,您得到有效但出乎意料的结果,相差约 2000 年,并且您在两个示例中都使用了相同的查询; 所改变的只是用户更改了 session 中的设置以不同方式格式化日期,任何用户都可以随时在自己的 session 中执行此操作。 不要依赖日期到字符串的隐式转换。

如果要将DATE数据类型的时间分量归零,则只需使用TRUNC而不是尝试使用TO_DATE

db<> 在这里摆弄

如果我需要从 sysdate 到 sysdate + 2 的假期,这是 3 天,但查询返回 2 天。

您需要做的就是在结果中加 1:

SELECT TRUNC( SYSDATE + 2 ) - TRUNC( SYSDATE ) + 1 AS total FROM DUAL;

但是,由于SYSDATE - SYSDATE (甚至TRUNC(SYSDATE) - TRUNC(SYSDATE) )将始终给出 0 的值,因此您可以将其简化为:

SELECT 3 AS total FROM DUAL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM