搜索
首页数据库mysql教程Oracle中的Date、TimeStamp和Interval(上)

在Oracle中,Date和TimeStamp类型存储精度可变的固定日期时间。Intreval可以很容易地存储一个时间量,如“8个小时”或“30天”,将两个时间戳相减,就会得到一个时间间隔(Interval),例如,将8小时加到一个TimeStamp上,即得到一个新的TimeStamp。 Oracle 5

在Oracle中,Date和TimeStamp类型存储精度可变的固定日期时间。Intreval可以很容易地存储一个时间量,如“8个小时”或“30天”,将两个时间戳相减,就会得到一个时间间隔(Interval),例如,将8小时加到一个TimeStamp上,即得到一个新的TimeStamp。

Oracle 5中已经支持Date类型,TimeStamp和Interval在Oracle 9i Release 1中才被引入。因此,Date最为常见,但你应该在新应用中使用TimeStamp类型,因为:

1、TimeStamp支持小数秒,而Date不支持;

2、TimeStamp支持时区,Date不支持。

(一)Date类型

Date类型是一个7字节的定宽日期/时间数据类型,它包含7个属性:世纪、世纪中哪一年、月份、月中的哪一天、小时、分钟、秒。Oracle使用一种内部格式来表示,它并不是保存20,12,10,31,12,01,00来表示2012年10月31日12:01:00,这个可以通过内置函数DUMP来查看:

Create table t (x date);
insert into t(x) values (to_date('2012-11-24 12:01:00','YYYY-MM-dd HH24:mi:ss'));
select x,dump(x,10) d from t;

查询结果:

Oracle中的Date、TimeStamp和Interval(上)
世纪和年份字节,即(120,112)采用一种“加100”的表示法来存储。必须将其减去100才能得到正确的世纪和年份。这是为了支持BC和AD日期。
如果从世纪字节减100得到负数,表示BC日期,例如:

insert into t (x) values( to_date( '01-08-4712bc','dd-MM-yyyybc hh24:mi:ss' ) );

此时,会报一个错,“ORA-01856: 要求BC/B.C. 或AD/A.D.”。

修改为如下语句:

Insert into t (x) values(to_date('01-08-4712BC','dd-MM-YYYYBC','nls_date_language=American'));
insert into t (x) values( to_date( '01-08-4710BC 12:01:13','dd-MM-yyyyBC hh24:mi:ss','nls_date_language=American') );

查看结果:

Oracle中的Date、TimeStamp和Interval(上)

别担心,读出的世纪和年份是“虚”的,其实记录是正确的,以下语句即可。

select x, to_char(x,'dd-mm-yyyybc','nls_date_language=American') AS TrueDate,dump(x,10) d from t;

Oracle中的Date、TimeStamp和Interval(上)

 世纪字节是53,而53-100=-47,这才是我们插入的真实世纪。由于这是一个负数,我们知道它是一个BC日期。这种存储格式还允许日期以一种二进制方式自然地排序。由于4712BC小于4710BC,我们可以测试一下排序:

select x, to_char(x,'dd-mm-yyyybc','nls_date_language=American') AS TrueDate,dump(x,10) d from t
order by TRUEDATE ASC;

Oracle中的Date、TimeStamp和Interval(上)

 接下来月份和日字节,自然存储,不作任何修改。小时、分、秒采用“加1”表示法存储,也就是各部分都减1,才能得到真实的时间。因此,午夜0点对应的日期字段表示为1,1,1

这种7字节格式能自然排序,可以采用一种二进制方式按从小到大或从大到小的顺序非常高效地进行排序。另外,这种结构允许很容易地进行截断,而无需把日期变成其他格式。即将尾部三个字节设置为1,1,1即可清除时间分量。

创建一个新表:

create table t ( what varchar2(10), x date );
insert into t (what, x) values
( 'downmoon',
  to_date( '25-11-2012 22:01:00',
           'dd-MM-yyyy hh24:mi:ss' ) );
insert into t (what, x)
select 'minute', trunc(x,'mi') from t
union all
select 'day', trunc(x,'dd') from t
union all
select 'month', trunc(x,'mm') from t
union all
select 'year', trunc(x,'y') from t
/
select what, x, dump(x,10) d from t;

结果:

 Oracle中的Date、TimeStamp和Interval(上)

要把这个日期截断,只取年份,数据库只要后5个字节置1,这是一个非常快速的操作。

而要向一个date增加时间或减去时间,请先遵循以下原则:

(1)使用NUMTODSINTERVAL增加时分秒;

(2)使用Date直接加数字增加天;

(3)使用ADD_MONTHS内置函数增加月和年不建议使NUMTOYMINTERVAL函数。因为前者会帮我们完成日期的舍入。

看示例:

alter session set nls_date_format='dd-MM-yyyy hh24:mi:ss';
select dt,add_months(dt,1) dt1,dt+NUMTOYMINTERVAL(1,'month') DT2
 from (select to_date('29-02-2012','dd-MM-yyyy')dt from dual);

Oracle中的Date、TimeStamp和Interval(上)

注意:ADD_MONTHS是添加自然月,而NUMTOYMINTERVAL是加到下个月的同一天,不管这一天是否有效,如果3月31日使用NUMTOYMINTERVAL加一个月,系统会报错。

 因此,这句会正确执行:

select dt,add_months(dt,1) dt1
 from (select to_date('31-03-2012','dd-MM-yyyy')dt from dual);

而这句会报错:指定月份的日期无效。

Oracle中的Date、TimeStamp和Interval(上)

 同理,向2012年2月29日增加1 年也会报错,因为不存在2013年2月29日。

 另外一个应用就是如何得到两个日期之差,方法如下:

 select numtoyminterval
       (trunc(months_between(dt2,dt1)),'month')
           years_months,
       numtodsinterval
           (dt2-add_months( dt1, trunc(months_between(dt2,dt1)) ),
            'day' )
           days_hours
  from (select to_date('2012-11-29 01:02:03','yyyy-MM-dd hh24:mi:ss') dt1,
               to_date('2014-03-15 11:22:33','yyyy-MM-dd hh24:mi:ss') dt2
          from dual );

Oracle中的Date、TimeStamp和Interval(上)

这个结果清楚地表明了两个日期相差1年、3个月、15天、10小时、20分、30秒。

下面一节我们将了解了下TimeStamp



助人等于自助!   3w@live.cn




声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您如何处理MySQL中的数据库升级?您如何处理MySQL中的数据库升级?Apr 30, 2025 am 12:28 AM

MySQL数据库升级的步骤包括:1.备份数据库,2.停止当前MySQL服务,3.安装新版本MySQL,4.启动新版本MySQL服务,5.恢复数据库。升级过程需注意兼容性问题,并可使用高级工具如PerconaToolkit进行测试和优化。

您可以使用MySQL的不同备份策略是什么?您可以使用MySQL的不同备份策略是什么?Apr 30, 2025 am 12:28 AM

MySQL备份策略包括逻辑备份、物理备份、增量备份、基于复制的备份和云备份。1.逻辑备份使用mysqldump导出数据库结构和数据,适合小型数据库和版本迁移。2.物理备份通过复制数据文件,速度快且全面,但需数据库一致性。3.增量备份利用二进制日志记录变化,适用于大型数据库。4.基于复制的备份通过从服务器备份,减少对生产系统的影响。5.云备份如AmazonRDS提供自动化解决方案,但成本和控制需考虑。选择策略时应考虑数据库大小、停机容忍度、恢复时间和恢复点目标。

什么是mySQL聚类?什么是mySQL聚类?Apr 30, 2025 am 12:28 AM

MySQLclusteringenhancesdatabaserobustnessandscalabilitybydistributingdataacrossmultiplenodes.ItusestheNDBenginefordatareplicationandfaulttolerance,ensuringhighavailability.Setupinvolvesconfiguringmanagement,data,andSQLnodes,withcarefulmonitoringandpe

如何优化数据库架构设计以在MySQL中的性能?如何优化数据库架构设计以在MySQL中的性能?Apr 30, 2025 am 12:27 AM

在MySQL中优化数据库模式设计可通过以下步骤提升性能:1.索引优化:在常用查询列上创建索引,平衡查询和插入更新的开销。2.表结构优化:通过规范化或反规范化减少数据冗余,提高访问效率。3.数据类型选择:使用合适的数据类型,如INT替代VARCHAR,减少存储空间。4.分区和分表:对于大数据量,使用分区和分表分散数据,提升查询和维护效率。

您如何优化MySQL性能?您如何优化MySQL性能?Apr 30, 2025 am 12:26 AM

tooptimizemysqlperformance,lofterTheSeSteps:1)inasemproperIndexingTospeedUpqueries,2)使用ExplaintplaintoAnalyzeandoptimizequeryPerformance,3)ActiveServerConfigurationStersLikeTlikeTlikeTlikeIkeLikeIkeIkeLikeIkeLikeIkeLikeIkeLikeNodb_buffer_pool_sizizeandmax_connections,4)

如何使用MySQL的函数进行数据处理和计算如何使用MySQL的函数进行数据处理和计算Apr 29, 2025 pm 04:21 PM

MySQL函数可用于数据处理和计算。1.基本用法包括字符串处理、日期计算和数学运算。2.高级用法涉及结合多个函数实现复杂操作。3.性能优化需避免在WHERE子句中使用函数,并使用GROUPBY和临时表。

MySQL批量插入数据的高效方法MySQL批量插入数据的高效方法Apr 29, 2025 pm 04:18 PM

MySQL批量插入数据的高效方法包括:1.使用INSERTINTO...VALUES语法,2.利用LOADDATAINFILE命令,3.使用事务处理,4.调整批量大小,5.禁用索引,6.使用INSERTIGNORE或INSERT...ONDUPLICATEKEYUPDATE,这些方法能显着提升数据库操作效率。

给MySQL表添加和删除字段的操作步骤给MySQL表添加和删除字段的操作步骤Apr 29, 2025 pm 04:15 PM

在MySQL中,添加字段使用ALTERTABLEtable_nameADDCOLUMNnew_columnVARCHAR(255)AFTERexisting_column,删除字段使用ALTERTABLEtable_nameDROPCOLUMNcolumn_to_drop。添加字段时,需指定位置以优化查询性能和数据结构;删除字段前需确认操作不可逆;使用在线DDL、备份数据、测试环境和低负载时间段修改表结构是性能优化和最佳实践。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具