[英]Calculate no of days between two latest dates for each ID column in 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.