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>
在后台检查中,我们编写了此查询。
答案 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