美文网首页
Oracle 中关于 Between and 日期边界问题

Oracle 中关于 Between and 日期边界问题

作者: 平面小狮子 | 来源:发表于2020-01-17 09:56 被阅读0次

sql编写测试中,使用了 between and 获取到了数据,但是结果集和预期有差异。

结论

  1. Oracle 对字符串进行日期转换时,如果是年月日的形式,即“2020-01-16”,将会被转为“2019-01-16 00:00:00”
  2. Oracle 在进行日期比较时,最好直接指定日期比较的格式,不要进行隐式转换

测试过程

  1. 表结构
CREATE TABLE "YB_DEV"."YB_WC_MONITOR" (
  "ID" NVARCHAR2(32) NOT NULL ,
  "AMMONIA_DENSITY" NVARCHAR2(10) ,
  "HYDROGEN_SULFIDE_DENSITY" NVARCHAR2(10) ,
  "DEVICE_CODE" NVARCHAR2(32) ,
  "CREATE_TIME" DATE DEFAULT SYSDATE  NOT NULL 
)
  1. 对数据按日期进行统计分析(查询15号和16号所有小时的记录)
  • 第一种情况(正常运行,但不符合预期)
select to_char(t.CREATE_TIME, 'MM-dd HH24') time, avg(t.AMMONIA_DENSITY) density 
from YB_WC_MONITOR t
where t.CREATE_TIME  BETWEEN to_date('2020-01-15', 'yyyy-MM-dd') and to_date('2020-01-16', 'yyyy-MM-dd')
group by to_char(t.CREATE_TIME, 'MM-dd HH24')
order by to_char(t.CREATE_TIME, 'MM-dd HH24')

查看结果:

01-15 00    0.0602604166666666666666666666666666666667
01-15 01    0.0444270833333333333333333333333333333333
01-15 02    0.0440104166666666666666666666666666666667
01-15 03    0.04765625
01-15 04    0.0498958333333333333333333333333333333333
01-15 05    0.0509375
01-15 06    0.1755208333333333333333333333333333333333
01-15 07    0.3606770833333333333333333333333333333333
01-15 08    0.2711979166666666666666666666666666666667
01-15 09    0.10734375
01-15 10    0.1194791666666666666666666666666666666667
01-15 11    0.10890625
01-15 12    0.07640625
01-15 13    0.1475
01-15 14    0.125625
01-15 15    0.07453125
01-15 16    0.08140625
01-15 17    0.12453125
01-15 18    0.0636538461538461538461538461538461538462
01-15 19    0.1045416666666666666666666666666666666667
01-15 20    0.0568333333333333333333333333333333333333
01-15 21    0.0683333333333333333333333333333333333333
01-15 22    0.0694583333333333333333333333333333333333
01-15 23    0.09025
01-16 00    0.0571428571428571428571428571428571428571

结果分析:
不符合预期,因为16号只有0点的数据。

  • 第二种情况:(正常运行,符合预期)
select to_char(t.CREATE_TIME, 'MM-dd HH24') time, avg(t.AMMONIA_DENSITY) density 
from YB_WC_MONITOR t
where to_char(t.CREATE_TIME, 'yyyy-MM-dd')  BETWEEN '2020-01-15' and '2020-01-16'
group by to_char(t.CREATE_TIME, 'MM-dd HH24')
order by to_char(t.CREATE_TIME, 'MM-dd HH24')

查看结果:

01-15 00    0.0602604166666666666666666666666666666667
01-15 01    0.0444270833333333333333333333333333333333
01-15 02    0.0440104166666666666666666666666666666667
01-15 03    0.04765625
01-15 04    0.0498958333333333333333333333333333333333
01-15 05    0.0509375
01-15 06    0.1755208333333333333333333333333333333333
01-15 07    0.3606770833333333333333333333333333333333
01-15 08    0.2711979166666666666666666666666666666667
01-15 09    0.10734375
01-15 10    0.1194791666666666666666666666666666666667
01-15 11    0.10890625
01-15 12    0.07640625
01-15 13    0.1475
01-15 14    0.125625
01-15 15    0.07453125
01-15 16    0.08140625
01-15 17    0.12453125
01-15 18    0.0636538461538461538461538461538461538462
01-15 19    0.1045416666666666666666666666666666666667
01-15 20    0.0568333333333333333333333333333333333333
01-15 21    0.0683333333333333333333333333333333333333
01-15 22    0.0694583333333333333333333333333333333333
01-15 23    0.09025
01-16 00    0.060125
01-16 01    0.0469166666666666666666666666666666666667
01-16 02    0.0557916666666666666666666666666666666667
01-16 03    0.0515833333333333333333333333333333333333
01-16 04    0.0494583333333333333333333333333333333333
01-16 05    0.0491666666666666666666666666666666666667
01-16 06    0.0846666666666666666666666666666666666667
01-16 07    0.2150416666666666666666666666666666666667
01-16 08    0.1055
01-16 09    0.124
01-16 10    0.1105833333333333333333333333333333333333
01-16 11    0.0824583333333333333333333333333333333333
01-16 12    0.0681666666666666666666666666666666666667
01-16 13    0.116125
01-16 14    0.08675
01-16 15    0.1010833333333333333333333333333333333333
01-16 16    0.0700416666666666666666666666666666666667
01-16 17    0.064875
01-16 18    0.0619583333333333333333333333333333333333
01-16 19    0.0575833333333333333333333333333333333333
01-16 20    0.0552083333333333333333333333333333333333
01-16 21    0.05875
01-16 22    0.05425
01-16 23    0.0567916666666666666666666666666666666667

结果分析:
数据完整,符合预期值

相关文章

  • Oracle 中关于 Between and 日期边界问题

    sql编写测试中,使用了 between and 获取到了数据,但是结果集和预期有差异。 结论 Oracle 对字...

  • 2020-03-11

    关于日期。。。 1.求日期间隔 Period period=Period.between(date1, date2...

  • 2019-01-13

    ORACLE之SQL篇-从日期提取时间的各部分 ORACLE之SQL篇-列出一年中每个季度的开始日期和结束日期 O...

  • 3、单行函数—日期函数

    Months_between() months_between函数返回两个日期之间的月份数。如果两个日期月份内天数...

  • Oracle常见函数(一)

    1、Oracle函数 1.1、常用的单行函数 1.2、日期 Oracle中,时间和日期是一起存储的,其数据类型是d...

  • Oracle中的日期玩法

    一、日期相关的内容1.在Oracle中,date类型可以直接进行加减天数,而加减月份要用add_months函数:...

  • oracle学习笔记

    oracle基本运算符 between ....and .... 运算符,取一个区间的值,仅限一个条件中 orac...

  • SQL语句:between关键词的使用

    今天使用oracle数据库写SQL,需要查询两个时间内的特定数据之和用到了sum函数和between函数 关于su...

  • oracle12c修改时间显示格式

    Oracle中 NLS_DATE_FORMAT的设置的两种方法:Oracle日期格式默认为:DD-MON-YY1....

  • python 时间插入oracle date类型中

    必须在会话中设置nls_date_格式,将日期从python转换为oracle 在插入oracle之前,请执行以下操作

网友评论

      本文标题:Oracle 中关于 Between and 日期边界问题

      本文链接:https://www.haomeiwen.com/subject/zthczctx.html