与数据库级NLS_CALENDAR相比,没有其他方法可以在不同的日历中定义间隔。通过使用虚拟列划分每个日期落入的(波斯)月份的数字表示,可以得到相同的效果:

create table test_temp_times (

id number(18) not null,

xdate date not null,

str varchar2(20),

ydate as (to_number(to_char(xdate, 'YYYYMM', 'nls_calendar=persian')))

)

partition by range(ydate)

interval(1)

(partition p0 values less than (139201))

enable row movement;

如果其中填充了示例开始日期后一年的每一天的记录:

insert into test_temp_times (id, xdate, str)

select level, date '2013-03-20' + level, null

from dual

connect by level < 366;

创建的分区如下所示:

select table_name, partition_name, high_value

from user_tab_partitions where table_name = 'TEST_TEMP_TIMES';

TABLE_NAME PARTITION_NAME HIGH_VALUE

------------------------------ ------------------------------ ----------

TEST_TEMP_TIMES P0 139201

TEST_TEMP_TIMES SYS_P479 139202

TEST_TEMP_TIMES SYS_P480 139203

TEST_TEMP_TIMES SYS_P481 139204

TEST_TEMP_TIMES SYS_P482 139205

TEST_TEMP_TIMES SYS_P483 139206

TEST_TEMP_TIMES SYS_P484 139207

TEST_TEMP_TIMES SYS_P485 139208

TEST_TEMP_TIMES SYS_P486 139209

TEST_TEMP_TIMES SYS_P487 139210

TEST_TEMP_TIMES SYS_P488 139211

TEST_TEMP_TIMES SYS_P489 139212

TEST_TEMP_TIMES SYS_P490 139213

13 rows selected

您还可以检查月份界限所属的分区:

select utp.partition_name, min(ttt.xdate), max(ttt.xdate)

from test_temp_times ttt

join user_objects uo on uo.object_id = dbms_rowid.rowid_object(ttt.rowid)

join user_tab_partitions utp on utp.table_name = uo.object_name

and utp.partition_name = uo.subobject_name

group by utp.partition_name

order by partition_name;

PARTITION_NAME MIN(TTT.XDATE) MAX(TTT.XDATE)

------------------------------ -------------- --------------

P0 2013-03-20 2013-03-20

SYS_P479 2013-03-21 2013-04-20

SYS_P480 2013-04-21 2013-05-21

SYS_P481 2013-05-22 2013-06-21

SYS_P482 2013-06-22 2013-07-22

SYS_P483 2013-07-23 2013-08-22

SYS_P484 2013-08-23 2013-09-22

SYS_P485 2013-09-23 2013-10-22

SYS_P486 2013-10-23 2013-11-21

SYS_P487 2013-11-22 2013-12-21

SYS_P488 2013-12-22 2014-01-20

SYS_P489 2014-01-21 2014-02-19

SYS_P490 2014-02-20 2014-03-19

至少,我认为这就是您要实现的目标。不幸的是,由于SQL Fiddle没有分区选项,因此无法添加演示,但这已针对11.2.0.3。进行了测试。

当然,您必须使其使用分区进行查询...如果我只是这样做的话:

select * from test_temp_times

where xdate = date '2013-11-01';

它找到包含计划的行:

-----------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |

-------------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 47 | 164 (0)| 00:00:02 | | |

| 1 | PARTITION RANGE ALL| | 1 | 47 | 164 (0)| 00:00:02 | 1 |1048575|

|* 2 | TABLE ACCESS FULL | TEST_TEMP_TIMES | 1 | 47 | 164 (0)| 00:00:02 | 1 |1048575|

-------------------------------------------------------------------------------------------------------

如果我将虚拟列明确添加到查询中:

select * from test_temp_times

where xdate = date '2013-11-01'

and ydate = to_number(to_char(date '2013-11-01', 'YYYYMM', 'nls_calendar=persian'));

然后,它知道要查询哪个分区:

----------------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |

----------------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 47 | 14 (0)| 00:00:01 | | |

| 1 | PARTITION RANGE SINGLE| | 1 | 47 | 14 (0)| 00:00:01 | 9 | 9 |

|* 2 | TABLE ACCESS FULL | TEST_TEMP_TIMES | 1 | 47 | 14 (0)| 00:00:01 | 9 | 9 |

----------------------------------------------------------------------------------------------------------

Clearly I haven't created any indexes yet. If you are looking for a whole month's worth of data, you would only need to query on a single ydate value, and ignore xdate; but presumably you'd need a mix at least some of the time.

oracle走当前时间分区,Oracle分区使用波斯日历的时间间隔相关推荐

  1. oracle如何查询时间格式,oracle时间格式讨论

    1. oracle对时间格式的数据存贮 Oracle以特定的存储格式来存储时间,占7个字节,与查询显示的时间无关.存贮的时间包括年月日时分秒,最小精度为秒,不存贮秒以下的时间单位.因此在一些前台支持毫 ...

  2. oracle怎么以时间排序,oracle指定数据排序在前面怎么处理

    最近工作碰到客户的特殊要求,需要将特定的数据排序在前面,然后才按时间顺序排序,这个之前还真没有碰到过,好在有万能的度娘,搜索了一下,发现可以实现,使用order by decode语句即可. 对于or ...

  3. oracle rman备份时间点,Oracle Rman 控制RMAN的备份时间,减少IO消耗

    一.问题描述 由于服务器配置不高,备份策略为周末全备.周一至周六差异备份. 平时服务器CPU使用30%左右. 全备份时,开启两个通道,CPU达到70%-80%左右,业务不卡顿.不掉单,session不 ...

  4. oracle sql比较时间大小,Oracle数据库中日期时间的操作比较和加减

    Oracle数据库中日期时间的操作比较和加减 Oracle关于时间/日期的操作 1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7 ...

  5. oracle最大空闲时间,使用Oracle PROFILE控制会话空闲时间

    Oracle推荐PROFILE和SQLNET.EXPIRE_TIME一起使用,但由于PL/SQL工具本身的特点,它会在SESSION的状态变成SNIPED(PROFILE IDLE_TI 客户想实现对 ...

  6. oracle查询sql时间ain,Oracle SQL 时间查询

    一.在使用Oracle的to_date函数来做日期转换时,很多Java程序员也许会和我一样,直觉的采用ldquo;yyyy-MM-dd HH:mm:ssrdquo;的 to_date()与24小时制表 ...

  7. 查看oracle会话空闲时间,使用Oracle PROFILE控制会话空闲时间

    客户想实现对会话空闲时间的控制,下面是做的一个例子. Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation.保留所有权 ...

  8. oracle数据库定时任务时间设置,oracle定时任务(dbms_job)的时间设置参考

    最后那一项可以参考如下: 每天午夜12点 'TRUNC(SYSDATE + 1)' 每天早上8点30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)' 每星期二中午1 ...

  9. oracle发邮件时间不对,oracle 发邮件错误

    oracle 发邮件错误 下面存储过程执行后有错误, create or replace procedure test_mail(msg_subject in varchar2, mes_contex ...

最新文章

  1. 【动画2】CALayer动画
  2. 结对代码 复审 意见
  3. ansible之fetch模块
  4. 简单的UIButton按钮动画效果iOS源码
  5. 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )
  6. C#中File的使用
  7. Android开发之设置DialogFragment的窗体背景色的方法亲测可用
  8. 工程勘察设计收费标准2002修订版_全过程工程咨询收费模式超全解析
  9. Android入门逆引手册 - 12 评分条(RatingBar)的使用
  10. 字典推导式_Python基础-推导式
  11. anaconda虚拟环境设置
  12. 【SQL】查询数据库中某个字段有重复值出现的信息
  13. 谷歌推出一款72个量子比特的通用量子计算机
  14. MetalSeed 's 网站收藏夹
  15. 数据库索引及基础优化入门
  16. 【业务安全-04】万能用户名及万能密码实验
  17. 北京周边有意境的好去处!!!
  18. mysql微信昵称存储_mysql保存微信昵称特殊字符的方法
  19. 形式化方法 Assignment 2: Proof engineering
  20. mysql归档模式_数据库归档模式设置步骤

热门文章

  1. 冷知识:摄影艺术与图像处理算法之间的纠葛关系你知道吗
  2. this指针 java_彻底理解Java中this指针
  3. 上海交大计算机学院奖学金,上海交通大学-电子信息与电气工程学院-学生工作办公室...
  4. linux uboot启动流程分析,uboot启动流程分析
  5. vues响应接口and实例
  6. 我是如何解决gitlab 命令行上传需要输密码
  7. http 路径 |_HTTP 请求與响应的格式及 curl 命令使用
  8. python默认数据转换_Python_数据类型转换
  9. js原生带缩略图的图片切换效果
  10. 推荐25款很棒的 HTML5 前端框架和开发工具【下篇】