Oracle 中时间的计算

Oracle 中时间的计算

 

Oracle中表示时间有DATETIMESTAMP,DATE可以存储年,,,小时,分钟,.

TIMESTAMPDATE的扩展,可以存储年,,,小时,分钟,,同时还可以存储秒的小数部分.秒的小数部分可以为9位即纳秒,默认为6为的微秒.

表示时间差的为INTERVAL:INTERVAL YEAR TO MONTH INTERVAL DAY TO SECOND两种.

 

1,Date类型:sysdatecurrent_date

1. 日期格式参数含义说明

D 一周中的星期几,数字

DAY 一周中的星期几的名字,使用空格填充到 9 个字符

DD 月中的第几天

DDD 年中的第几天

DY 一周中的星期几的简写名

IW ISO 标准的年中的第几周

IYYY ISO 标准的四位年份

YYYY 四位年份

YYY,YY,Y 年份的最后三位,两位,一位

HH 小时,按 12 小时计

HH24 小时,按 24 小时计

MI

SS

MM

Mon 月份的简写

Month 月份的全名

W 该月的第几个星期

WW 年中的第几个星期

 

从日期到字符串操作:to_char(日期,日期格式参数).

:

select sysdate,to_char(sysdate,'DD/MM/YYYY HH24:MI:SS') from dual
select sysdate,to_char(sysdate,'DD/MM/YYYY HH:MI:SS') from dual

select sysdate,to_char(sysdate,'DD/MON/YYYY') from dual
select sysdate,to_char(sysdate,'DDD') from dual

 

从字符串到日期转换:to_date(字符串,日期格式参数).日期格式参数的组合要比to_char.

:

select to_date('2010/07/16 21:15:37','yyyy/mm/dd hh24:mi:ss') from dual

select to_date('198','DDD') from dual

 

两个日期相减得到的是一个以天为单位的number,带小数.

天:
ROUND(TO_NUMBER(DATE1 - DATE2))
小时:
ROUND(TO_NUMBER(DATE1 - DATE2) * 24)
分钟:
ROUND(TO_NUMBER(DATE1 - DATE2) * 24 * 60)
秒:
ROUND(TO_NUMBER(DATE1 - DATE2) * 24 * 60 * 60)
毫秒:
ROUND(TO_NUMBER(DATE1 - DATE2) * 24 * 60 * 60 * 1000)

 

日期和INTERVAL的操作:加减操作.

当前时间减去 7 分钟的时间

select sysdate,sysdate - interval '7' MINUTE from dual

当前时间加 7 小时的时间

select sysdate + interval '7' hour from dual

当前时间减去 7 天的时间

select sysdate - interval '7' day from dual

当前时间减去 7 月的时间

select sysdate,sysdate - interval '7' month from dual

当前时间减去 7 年的时间

select sysdate,sysdate - interval '7' year from dual

时间间隔乘以一个数字

select sysdate,sysdate - 8 *interval '2' hour from dual

 

2,TIMESTAMP类型:systimestampCURRENT_TIMESTAMP.

FF [1..9]小数秒.

 

 

 

 

 

 

从字符串到时间戳操作:to_timestamp(字符串,日期格式参数).

select to_timestamp('2010/07/16 21:15:37','yyyy/mm/dd hh24:mi:ss') from dual
select to_timestamp('2010/07/16 21:15:37.123456','yyyy/mm/dd hh24:mi:ss.ff') from dual

select to_timestamp('2010/07/16 21:15:37.123456789','yyyy/mm/dd hh24:mi:ss.ff9') from dual

 

从时间戳到字符串操作:to_char(时间戳,日期格式参数).

select to_char(systimestamp,'yyyy/mm/dd hh24:mi:ss') from dual

select to_char(systimestamp,'yyyy/mm/dd hh24:mi:ss.ff7') from dual

select to_char(systimestamp,'DDD') from dual

 

date转为timestamp,转后的的timestamp的小数秒为0:

select systimestamp ,CAST (sysdate  AS timestamp)  from dual

 

timestamp转为date,转后的date可能和前面的date有一秒之差:

select sysdate,CAST (systimestamp  AS DATE)  from dual

 

两个timestamp相减的结果是interval 格式为 "小时微妙" DAY TO Second 格式.

 

本文用到的表:

CREATE TABLE timetest
(
  ID         INTEGER,
  BEGINTMT   TIMESTAMP(6),
  ENDTMT     TIMESTAMP(6),
  BEGINDATE  DATE,
  ENDDATE    DATE
)

insert into timetest values(1,to_timestamp('2010/05/12 12:23:34:4500','yyyy/mm/dd hh24:mi:ss:ff4'),
to_timestamp('2010/05/13 13:34:45:5600','yyyy/mm/dd hh24:mi:ss:ff4'),
to_date('2010/05/12 12:23:34','yyyy/mm/dd hh24:mi:ss'),
to_date('2010/05/13 13:34:45','yyyy/mm/dd hh24:mi:ss'))

 

insert into timetest values(2,to_timestamp('2009/04/12 12:33:35:4600','yyyy/mm/dd hh24:mi:ss:ff4'),
to_timestamp('2010/05/13 13:34:45:5600','yyyy/mm/dd hh24:mi:ss:ff4'),
to_date('2009/05/12 12:23:34','yyyy/mm/dd hh24:mi:ss'),
to_date('2010/05/12 12:23:34','yyyy/mm/dd hh24:mi:ss'))

 

数据为:

select ID,BEGINTMT, ENDTMT, ENDTMT- BEGINTMT from timetest

ID    BEGINTMT                    ENDTMT                        ENDTMT-BEGINTMT
1    12/05/2010 12:23:34.450000    13/05/2010 13:34:45.560000    +01 01:11:11.110000
2    12/04/2009 12:33:35.460000    13/05/2010 13:34:45.560000    +396 01:01:10.100000

 

对相减的结果处理:

SELECT ENDTMT- BEGINTMT,substr((ENDTMT- BEGINTMT),instr((ENDTMT- BEGINTMT),' ')+7,2) seconds,
substr((ENDTMT- BEGINTMT),instr((ENDTMT- BEGINTMT),' ')+4,2)         minutes,
substr((ENDTMT- BEGINTMT),instr((ENDTMT- BEGINTMT),' ')+1,2)         hours,
trunc(to_number(substr((ENDTMT- BEGINTMT),1,instr(ENDTMT- BEGINTMT,' '))))  days,
trunc(to_number(substr((ENDTMT- BEGINTMT),1,instr(ENDTMT- BEGINTMT,' ')))/7) weeks
FROM timetest;

 

ENDTMT-BEGINTMT            SECONDS    MINUTES    HOURS    DAYS    WEEKS
+01 01:11:11.110000           11              11             01          1           0
+396 01:01:10.100000         10               01             01          396       56

 

INTERVAL YEAR TO MONTH数据类型:以下来源于 http://blog.chinaunix.net/u/19782/showart_212188.html

Oracle语法:
INTERVAL 'integer [- integer]' {YEAR | MONTH} [(precision)][TO {YEAR | MONTH}]
该数据类型常用来表示一段时间差, 注意时间差只精确到年和月. precision为年或月的精确域, 有效范围是09, 默认值为
2.
eg:
INTERVAL '123-2' YEAR(3) TO MONTH    
表示: 1232个月, "YEAR(3)" 表示年的精度为3, 可见"123"刚好为3为有效数值, 如果该处YEAR(n), n<3就会出错, 注意默认是
2.
INTERVAL '123' YEAR(3)
表示: 1230个月

INTERVAL '300' MONTH
表示: 300个月, 注意该处MONTH的默认精度为3
.(select INTERVAL '1300' MONTH(4)   from dual)
INTERVAL '4' YEAR    
表示: 4, INTERVAL '4-0' YEAR TO MONTH 是一样的

INTERVAL '50' MONTH    
表示: 50个月, INTERVAL '4-2' YEAR TO MONTH 是一样
INTERVAL '123' YEAR    
表示: 该处表示有错误, 123精度是3, 但系统默认是2, 所以该处应该写成 INTERVAL '123' YEAR(3) "3"改成大于3小于等于9的数值都可以的
INTERVAL '5-3' YEAR TO MONTH + INTERVAL '20' MONTH =
INTERVAL '6-11' YEAR TO MONTH
表示: 53个月 + 20个月 = 611个月

 

 

INTERVAL DAY TO SECOND数据类型以下来源于http://blog.chinaunix.net/u/19782/showart_212191.html
Oracle
语法
:
INTERVAL '{ integer | integer time_expr | time_expr }'
{ { DAY | HOUR | MINUTE } [ ( leading_precision ) ]
| SECOND [ ( leading_precision [, fractional_seconds_precision ] ) ] }
[ TO { DAY | HOUR | MINUTE | SECOND [ (fractional_seconds_precision) ] } ]

leading_precision
值的范围是09, 默认是2. time_expr的格式为:HH[:MI[:SS[.n]]] or MI[:SS[.n]] or SS[.n], n表示微秒
.
范围值
:
HOUR:    0 to 23
MINUTE: 0 to 59
SECOND: 0 to 59.999999999
eg:
INTERVAL '4 5:12:10.222' DAY TO SECOND(3)
表示: 45小时1210.222

INTERVAL '4 5:12' DAY TO MINUTE
表示: 45小时12
INTERVAL '400 5' DAY(3) TO HOUR
表示: 4005小时, 4003为精度,所以"DAY(3)", 注意默认值为2.
INTERVAL '400' DAY(3)
表示: 400

INTERVAL '11:12:10.2222222' HOUR TO SECOND(7)
表示: 11小时1210.2222222
INTERVAL '11:20' HOUR TO MINUTE
表示: 11小时20
INTERVAL '10' HOUR
表示: 10小时
INTERVAL '10:22' MINUTE TO SECOND
表示: 1022
INTERVAL '10' MINUTE
表示: 10
INTERVAL '4' DAY
表示: 4
INTERVAL '25' HOUR
表示: 25小时
INTERVAL '40' MINUTE
表示: 40
INTERVAL '120' HOUR(3)
表示: 120小时
INTERVAL '30.12345' SECOND(2,4)    
表示: 30.1235, 因为该地方秒的后面精度设置为4, 要进行四舍五入.
INTERVAL '20' DAY - INTERVAL '240' HOUR = INTERVAL '10-0' DAY TO SECOND
表示: 20 - 240小时 = 100

 

interval相关的函数:

NUMTODSINTERVAL(n, 'interval_unit')
n转换成interval_unit所指定的值, interval_unit可以为
: DAY, HOUR, MINUTE, SECOND
注意该函数不可以转换成YEARMONTH.

select numtodsinterval(100,'DAY') + numtodsinterval(10,'MINUTE')  from dual;

 

NUMTOYMINTERVAL(n, 'interval_unit')
interval_unit
可以为: YEAR, MONTH

select NUMTOYMINTERVAL(100,'YEAR') + NUMTOYMINTERVAL(10,'MONTH')  from dual;

 

两个函数的结果不能进行加减操作:下面的操作不合法.

select  NUMTOYMINTERVAL(100,'YEAR')+ numtodsinterval(10,'MINUTE')  from dual;

 

对于时间的比较,今天比昨天大,今天减昨天为正数.

 

### 回答1: 在Oracle计算两个timestamp之间的时间差可以通过以下方法实现: 1. 使用时间差函数:可以使用“extract”函数获取两个时间戳之间的差值,例如: ``` SELECT EXTRACT(DAY FROM (timestamp2 - timestamp1)) AS day_diff, EXTRACT(HOUR FROM (timestamp2 - timestamp1)) AS hour_diff, EXTRACT(MINUTE FROM (timestamp2 - timestamp1)) AS minute_diff, EXTRACT(SECOND FROM (timestamp2 - timestamp1)) AS second_diff FROM my_table; ``` 这将返回两个时间戳之间的天数、小时数、分钟数和秒数之间的差值。 2. 使用日期函数:也可以使用日期函数如“NUMTODSINTERVAL”和“NUMTOYMINTERVAL”函数来计算两个时间戳之间的差值,例如: ``` SELECT NUMTODSINTERVAL(timestamp2 - timestamp1, 'SECOND') AS diff FROM my_table; ``` 这将返回两个时间戳之间的差值,以秒为单位。 注意,在Oracle时间戳之间的差值将被表示为INTERVAL DAY TO SECOND或INTERVAL YEAR TO MONTH数据类型。 ### 回答2: 在Oracle计算timestamp的时间差,可以使用函数来实现。以下是一种常见的方法: 1. 首先,使用TIMESTAMP类型的两个字段相减,可以得到它们之间的时间差,单位为天。 例如,如果有两个字段ts1和ts2,可以使用以下语句获取它们之间的时间差: ```sql SELECT ts2 - ts1 FROM table_name; ``` 2. 如果想获取具体的小时、分钟或秒数的时间差,可以使用EXTRACT函数来提取相应的时间部分。 以下是使用EXTRACT函数计算小时差的示例: ```sql SELECT EXTRACT(HOUR FROM (ts2 - ts1)) FROM table_name; ``` 3. 另外,如果需要获得更加精确的时间差,可以使用Oracle提供的INTERVAL数据类型。可以直接使用INTERVAL关键字来计算两个时间之间的时间差。 以下是计算两个timestamp类型字段之间时间差,并以月为单位显示的示例: ```sql SELECT ts2 - ts1 MONTH FROM table_name; ``` 通过使用上述方法之一,就可以在Oracle计算timestamp的时间差。注意,在计算时间差时,要确保timestamp字段的有效性和正确格式。 ### 回答3: 在Oracle,我们可以使用两个方法来计算timestamp的时间差。 第一种方法是使用TIMESTAMPDIFF函数。这个函数可以计算两个timestamp之间的差异,并返回以设定的时间单位表示的差异值。例如,我们可以使用以下语句计算两个timestamp之间的差异: SELECT TIMESTAMPDIFF(SECOND, t1, t2) AS 时间差 FROM 表名; 这将返回t1和t2之间的时间差,以秒为单位。 另一种方法是使用EXTRACT函数。这个函数可以从timestamp提取日期或时间部分,并进行计算。我们可以使用以下语句来计算两个timestamp之间的差异: SELECT EXTRACT(DAY FROM (t2 - t1)) AS 天差, EXTRACT(HOUR FROM (t2 - t1)) AS 小时差, EXTRACT(MINUTE FROM (t2 - t1)) AS 分钟差, EXTRACT(SECOND FROM (t2 - t1)) AS 秒差 FROM 表名; 这将返回两个timestamp之间的天、小时、分钟和秒的差异。 无论是使用TIMESTAMPDIFF函数还是EXTRACT函数,我们都可以根据需要选择不同的时间单位来计算时间差。这些函数都可以有效地计算timestamp之间的时间差,以便我们可以在Oracle进行时间相关的计算和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值