您能告诉我Oracle查询中fromdate-0.0142的含义吗

时间:2019-06-04 05:45:46

标签: database oracle

select 
id_no, nvl(OD_PLACECODE,-1) OD_PLACECODE, nvl(PURPOSECODE,-1) PURPOSECODE
from tonduty
where
to_date(sysdate,'dd-mon-yy hh24:mi:ss') between fromdate-0.0142 and 
todate 
and
actinact =1;

能否请您告诉我以上查询中fromdate-0.0142的含义。

请在fromdate字段中找到示例数据。

01-06-2019 09:00:00
04-06-2019 08:00:00
01-06-2019 09:00:00
04-06-2019 10:00:00

fromdate数据类型在oracle中为DATE

任何帮助将不胜感激。

这不是作业。我会清楚地向你解释。

在我们的办公室中,我们有一个考勤系统(员工在进入和离开办公室时应刷身份证)。

如果某人想外出上班(值班),则需要申请OD。申请OD时,我们会将这些信息保存在ONDUTY表中。申请后,他们将刷身份证(在后端软件中,我们将检查该员工是否申请了OD,如果是,我们将其视为OD OUT。如果未申请OD,则将其视为OUT。)< / p>

在后台检查中,我们编写了此查询。

1 个答案:

答案 0 :(得分:2)

在日期算术中,我们从某个日期减去。这意味着:

SQL> select 0.0142 days,
  2         0.0142 * 24 hours,
  3         0.0142 * 24 * 60 minutes
  4  from dual;

      DAYS      HOURS    MINUTES
---------- ---------- ----------
     ,0142      ,3408     20,448

SQL>

如您所见,0.0142不是一个 nice 数字;它表示20分钟(和26.88秒,为0.448 * 60 = 26.88)。

为什么从日期值中减去它,我不知道。

根据您的评论(允许20分钟):问(该代码的)作者为什么他们不使用20分钟,然后使用20.448?方法如下:

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

Session altered.

SQL> select sysdate,
  2         sysdate - 20 / (24 * 60) twenty_minutes_ago
  3  from dual;

SYSDATE             TWENTY_MINUTES_AGO
------------------- -------------------
05.06.2019 11:21:10 05.06.2019 11:01:10

20分钟是0.013888889,而不是0.0142

SQL> select 20 / (24 * 60) twenty_minutes
  2  from dual;

TWENTY_MINUTES
--------------
    ,013888889

SQL>

这意味着您的代码应该是

between fromdate - 0.01389 and todate 

或者甚至更好

between fromdate - (20 / (24 * 60)) and todate