专栏首页bisal的个人杂货铺DATE类型的“小陷阱”

DATE类型的“小陷阱”

朋友提了个问题,虽然不是难题,但确实很细微,很可能就掉进了陷阱中,假设执行日期是2020-08-26,创建测试数据,

SQL> create table t01 (id number, insert_time date); 
Table created.


SQL> insert into t01 values(1, to_date('2020-08-25','yyyy-mm-dd'));
1 row created.

需求是检索insert_time是昨天的记录,他用这条SQL,通过trunc(sysdate)-1得到前一天的日期作为条件,乍看很合理,但是结果是0,

SQL> select * from t01 where insert_time > trunc(sysdate)-1;
no rows selected

但是他使用trunc(sysdate)-2,能得到记录,“-2”不是前天?不是昨天啊?

SQL> select * from t01 where insert_time > trunc(sysdate)-2;
        ID INSERT_TIME
---------- ------------------
         1 25-AUG-20

其实这个问题很简单,DATE类型在Oracle中定义包含了“年、月、日、时、分、秒”,即使像上例中,to_date('2020-08-25','yyyy-mm-dd'),只是指定年月日,还是包括时分秒,默认值是0,

DATE Data Type The DATE data type stores date and time information. Although date and time information can be represented in both character and number data types, the DATE data type has special associated properties. For each DATE value, Oracle stores the following information: year, month, day, hour, minute, and second. The default date values are determined as follows: The year is the current year, as returned by SYSDATE. The month is the current month, as returned by SYSDATE. The day is 01 (the first day of the month). The hour, minute, and second are all 0.

trunc(sysdate)-1是指"昨天00:00:00",如下SQL,能证明,

SQL> select to_char(trunc(sysdate),'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(TRUNC(SYSDA
-------------------
2020-08-26 00:00:00

条件中的>trunc(sysdate)-1,就是超过昨天00:00:00的,而存储的数据,to_date('2020-08-25','yyyy-mm-dd'),就是昨天00:00:00,因此无结果,这是正常的,需要用insert_time > trunc(sysdate)-2,才可以找到。

但如果插入时就指定了时分秒,就会不同了,

SQL> insert into t01 values(1, to_date('2020-08-25 01:00:00','yyyy-mm-dd hh24:mi:ss'));
1 row created.

是可以找到的,

SQL> select * from t01 where insert_time > trunc(sysdate)-1;
        ID INSERT_TIME
---------- ------------------
         1 25-AUG-20

格式化下,会更清楚些,的确是找到了01:00:00的,

SQL> select id, to_char(insert_time,  'yyyy-mm-dd hh24:mi:ss') from t01 where insert_time > trunc(sysdate)-1;
        ID TO_CHAR(INSERT_TIME
---------- -------------------
         1 2020-08-25 01:00:00

这个问题,虽然细微,但稍不注意,可能在写程序时,就会忽视,造成边界值隐患,因此,还是要关注下。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 领会ORA-01405错误的含义和解决

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bisal/article/details/89167...

    bisal
  • 学习show_space存储过程

    今天学习和介绍一个有用的工具,来自TOM大神的show_space,其实这就是一个存储过程,用他可以统计一些段的用度,非常方便,网上流传着不同的版本。

    bisal
  • Oracle的隐式转换

    都说Oracle存在NUMBER和VARCHAR2类型的隐式转换,严格意义上需要避免,但为何需要避免,从下面的实验进行验证。 1. 创建测试表和索引 cre...

    bisal
  • Python 编程技巧之字符串拼接

    这样写不仅代码不好看,而且性能也不高。实际上,在Python中,字符串的拼接有多种实现方法,这里就一一介绍一下,并简单的测试其性能

    arcticfox
  • 深度学习系列(1):感知机

    深度学习系列(1):感知机 前言 小论文总算告一段落了,近期开始深度学习了,跟着Hinton神经网络公开课边看边总结。视频参考链接如下:https://www....

    用户1147447
  • 快速学习-登录功能实现-页面中错误提示

    6) JSP的脚本元素 ① 脚本片段是嵌入到JSP中Java代码段,格式以<%开头,%>结尾,两个%号之间就可以编写Java代码了

    cwl_java
  • 入门感知机:一种二分类模型 | 山人聊算法 | 3th

    感知机是神经网络与支持向量机的基础,如下图所示,这是一个多层神经网络的结构图,其中的一个节点就是感知机。

    用户7623498
  • 深度学习入门教程 第一讲

    用户1107453
  • python os.path模块

    语法:  os.path.join(path1[,path2[,......]])

    py3study
  • Extjs 项目中常用的小技巧,也许你用得着(2)

    接着来,也是刚刚遇到的 panel怎么进行收缩 这会panel就会出现这个 ? 点这个就可以收缩了 collapsible: true, pa...

    hbbliyong

扫码关注云+社区

领取腾讯云代金券