ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 常见时间转换函数

常见时间转换函数

原创 Linux操作系统 作者:双629 时间:2009-01-09 14:34:10 0 删除 编辑

Oracle 时间转换成分钟,秒2008-06-02 00:13系统时间加上一分钟:select sysdate+1/(24*60) from dual;

select to_date(sysdate, 'yyyymmdd hh24:mi:ss') + 1/(24*60) from dual;

系统时间加上一秒钟:select sysdate+1/(24*60*60) from dual;

两时间之差:select (sysdate1 - sysdate2)*24*60 from dual;Oracle使用天来作为消逝时间的单位

1.删除表delete语句跟acess不同,oracle里面 DELETE FROM表名WHERE

而acess里面是Delete * from 表名 WHERE 多了个*,导致oracle里面老是提示:ORA-00903: 表名无效.

另外一个更加隐藏的问题是字段默认值,默认系统时间,acess为 Now(),而oracle为sysdate,更郁闷的是导入的时候默认值是没有导入的.

今天有发现oracle没有自动增长值这个功能的,要自己写序列实现.

2.TOP 1 要换成ROWNUM<=1

如 SELECT TOP 1 * FROM FSCREEN WHERE ADMIN='ZDZ' ORDER BY TSCRNUM DESC要换成

SELECT * FROM FSCREEN WHERE ADMIN='ZDZ' AND ROWNUM<=1 ORDER BY TSCRNUM DESC

3.比较日期的

access中找出5分钟内注册的用户

//sql="update temps set logtime=now() where datediff('n',logtime,now())<"+ExTime+" and admin='"+admin+"'and ipre='"+Ip+"'";

oracle中没有DateDiff()函数,直接相减整数的才可以得到正确的数,时分秒就不行了,要改成下面的形式round(to_number(sysdate-logtime)*1440)即
sql="update temps set sysdate where round(to_number(sysdate-logtime)*1440)<"+ExTime+" and admin='"+admin+"'and ipre='"+Ip+"'";

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


select to_char(to_date('2007-11-16 10:55:22' , 'yyyy-mm-dd hh24:mi:ss'),'mi')-to_char(to_date('2007-11-16 10:50:22' , 'yyyy-mm-dd hh24:mi:ss'),'mi') from dual

结果为5,取出秒来相减

select t.logtime ,to_char(to_date(t.logtime),'mi'),to_char(to_date(sysdate),'mi'),to_char(to_date(t.logtime),'mi')-to_char(to_date(sysdate),'mi')
from temps t where (to_char(to_date(t.logtime),'mi')-to_char(to_date(sysdate),'mi'))< 5

结果为2007-11-15 13:40:44 00 00 0 传入参数的to_date(sysdate),'mi'取出来的时分秒都为00,年月日正确.

select logtime,sysdate,round(to_number(sysdate-logtime)*1440) from temps where round(to_number(sysdate-logtime)*1440)>5

结果为2007-11-16 13:28:44 2007-11-16 16:08:14 160正确地取出相差的分钟数,要用round函数和to_number,不能用to_date

select sysdate-(sysdate-3) from dual;

结果为3

SELECT to_date('2006-11-16', 'yyyy-mm-dd') - to_date('2006-11-14', 'yyyy-mm-dd') FROM dual ;

结果为2

SELECT to_date('2006-11-16', 'yyyy-mm-dd') - to_date(sysdate) FROM dual ;

结果为-365

SELECT to_date('2007-11-16 10:50:24' , 'yyyy-mm-dd hh24:mi:ss')-to_date(sysdate) FROM dual ;

结果为0.451666666666667

SELECT to_date('2007-11-16 10:50:24' , 'yyyy-mm-dd hh24:mi:ss')-sysdate FROM dual ;

结果为-0.205

下面转载别人的资料

在ORACLE里日期类型是可以直接进行比较的。举个例子:
引用:
SQL> SELECT to_date('2006-12-05', 'yyyy-mm-dd') - to_date('2006-12-07', 'yyyy-mm-dd') FROM dual ;

TO_DATE('2006-12-05','YYYY-MM-DD')-TO_DATE('2006-12-07','YYYY-MM-DD')
---------------------------------------------------------------------
                                                                   -2
这说明2006-12-05要比7号早2天。
引用:
SQL> SELECT to_date('2006-12-07 14:23:24' , 'yyyy-mm-dd hh24:mi:ss') + 1/24 FROM dual ;

TO_DATE('2006-12-07
-------------------
2006-12-07 15:23:24

SQL>
这是说明在某一时间上加一小时,1是代表一天,1/24就是一小时,同理1/24/60就是一分钟

其实你不把别的数据库里的东西照搬到ORACLE里,就可以避免这样明显的错误了。

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

计算时间差是Oracle DATA数据类型的一个常见问题。Oracle支持日期计算,你可以创建诸如“日期1-日期2”这样的表达式来计算这两个日期之间的时间差。


一旦你发现了时间差异,你可以使用简单的技巧来以天、小时、分钟或者秒为单位来计算时间差。为了得到数据差,你必须选择合适的时间度量单位,这样就可以进行数据格式隐藏。


使用完善复杂的转换函数来转换日期是一个诱惑,但是你会发现这不是最好的解决方法。


round(to_number(end-date-start_date))- 消逝的时间(以天为单位);


round(to_number(end-date-start_date)*24)- 消逝的时间(以小时为单位);


round(to_number(end-date-start_date)*1440)- 消逝的时间(以分钟为单位)。


显示时间差的默认模式是什么?为了找到这个问题的答案,让我们进行一个简单的SQL *Plus查询。


SQL> select sysdate-(sysdate-3) from dual;SYSDATE-(SYSDATE-3)------------------- 3

这里,我们看到了Oracle使用天来作为消逝时间的单位,所以我们可以很容易的使用转换函数来把它转换成小时或者分钟。然而,当分钟数不是一个整数时,我们就会遇到放置小数点的问题。


Select(sysdate-(sysdate-3.111))*1440 from dual;(SYSDATE-(SYSDATE-3.111))*1440------------------------------4479.83333


当然,我们可以用ROUND函数(即取整函数)来解决这个问题,但是要记住我们必须首先把DATE数据类型转换成NUMBER数据类型。


Select round(to_number(sysdate-(sysdate-3.111))*1440)from dual;ROUND(TO_NUMBER(SYSDATE-(SYSDATE-3.111))*1440)---------------------------------------------- 4480

我们可以用这些函数把一个消逝时间近似转换成分钟并把这个值写入Oracle表格中。在这个例子里,我们有一个离线(logoff)系统级触发机制来计算已经开始的会话时间并把它放入一个OracleSTATSPACK USER_LOG扩展表格之中。


Updateperfstat.stats$user_logsetelapsed_minutes =round(to_number(logoff_time-logon_time)*1440)where user = user_idandelapsed_minutes is NULL;

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

SQL中的单记录函数
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;

A A ZERO SPACE
--------- --------- --------- ---------
65 97 48 32


2.CHR
给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;

ZH C
-- -
赵 A

3.CONCAT
连接两个字符串;
SQL> select concat('010-','88888888')||'转23' 高乾竞电话 from dual;

高乾竞电话
----------------
010-88888888转23

4.INITCAP
返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap('smith') upp from dual;

UPP
-----
Smith


5.INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1
SQL> select instr('oracle traning','ra',1,2) instring from dual;

INSTRING
---------
9


6.LENGTH
返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;

NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾竞 3 北京市海锭区 6 9999.99 7

 

7.LOWER
返回字符串,并将所有的字符小写
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;

AABBCCDD
--------
aabbccdd


8.UPPER
返回字符串,并将所有的字符大写
SQL> select upper('AaBbCcDd') upper from dual;

UPPER
--------
AABBCCDD

 

9.RPAD和LPAD(粘贴字符)
RPAD 在列的右边粘贴字符
LPAD 在列的左边粘贴字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;

LPAD(RPAD('GAO',1
-----------------
*******gao*******
不够字符则用*来填满


10.LTRIM和RTRIM
LTRIM 删除左边出现的字符串
RTRIM 删除右边出现的字符串
SQL> select ltrim(rtrim(' gao qian jing ',' '),' ') from dual;

LTRIM(RTRIM('
-------------
gao qian jing


11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr('13088888888',3,8) from dual;

SUBSTR('
--------
08888888


12.REPLACE('string','s1','s2')
string 希望被替换的字符或变量
s1 被替换的字符串
s2 要替换的字符串
SQL> select replace('he love you','he','i') from dual;

REPLACE('H
----------
i love you


13.SOUNDEX
返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');

SQL> select xm from table1 where soundex(xm)=soundex('weather');

XM
--------
weather
wether


14.TRIM('s' from 'string')
LEADING 剪掉前面的字符
TRAILING 剪掉后面的字符
如果不指定,默认为空格符

15.ABS
返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;

ABS(100) ABS(-100)
--------- ---------
100 100


16.ACOS
给出反余弦的值
SQL> select acos(-1) from dual;

ACOS(-1)
---------
3.1415927


17.ASIN
给出反正弦的值
SQL> select asin(0.5) from dual;

ASIN(0.5)
---------
.52359878


18.ATAN
返回一个数字的反正切值
SQL> select atan(1) from dual;

ATAN(1)
---------
.78539816


19.CEIL
返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;

CEIL(3.1415927)
---------------
4


20.COS
返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;

COS(-3.1415927)
---------------
-1


21.COSH
返回一个数字反余弦值
SQL> select cosh(20) from dual;

COSH(20)
---------
242582598


22.EXP
返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;

EXP(2) EXP(1)
--------- ---------
7.3890561 2.7182818


23.FLOOR
对给定的数字取整数
SQL> select floor(2345.67) from dual;

FLOOR(2345.67)
--------------
2345


24.LN
返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;

LN(1) LN(2) LN(2.7182818)
--------- --------- -------------
0 .69314718 .99999999


25.LOG(n1,n2)
返回一个以n1为底n2的对数
SQL> select log(2,1),log(2,4) from dual;

LOG(2,1) LOG(2,4)
--------- ---------
0 2


26.MOD(n1,n2)
返回一个n1除以n2的余数
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;

MOD(10,3) MOD(3,3) MOD(2,3)
--------- --------- ---------
1 0 2


27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;

POWER(2,10) POWER(3,3)
----------- ----------
1024 27


28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
56 -55 55 -55


29.SIGN
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;

SIGN(123) SIGN(-100) SIGN(0)
--------- ---------- ---------
1 -1 0


30.SIN
返回一个数字的正弦值
SQL> select sin(1.57079) from dual;

SIN(1.57079)
------------
1


31.SIGH
返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual;

SIN(20) SINH(20)
--------- ---------
.91294525 242582598


32.SQRT
返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;

SQRT(64) SQRT(10)
--------- ---------
8 3.1622777


33.TAN
返回数字的正切值
SQL> select tan(20),tan(10) from dual;

TAN(20) TAN(10)
--------- ---------
2.2371609 .64836083


34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual;

TANH(20) TAN(20)
--------- ---------
1 2.2371609

 

35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;

TRUNC1 TRUNC(124.16666,2)
--------- ------------------
100 124.16

 

36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;

TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;

TO_CHA
------
199910


37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;

TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;

LAST_DAY(S
----------
31-5月 -04


38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;

MON_BETWEEN
-----------
9
SQL>select months_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;

MON_BETW
---------
-60


39.NEW_TIME(date,'this','that')
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;

BJ_TIME LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32


40.NEXT_DAY(date,'day')
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day('18-5月-2001','星期五') next_day from dual;

NEXT_DAY

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15037128/viewspace-534791/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2008-08-19

  • 博文量
    1
  • 访问量
    1845