数据库trunc,数据库truncate函数

http://www.itjxue.com  2023-01-08 13:24  来源:未知  点击次数: 

oracle的一致性约束中的参考键以及select userenv('language') from dual;和trunc函数的作用

唯一属性,唯一约束可以定义在一个或多个字段上;唯一约束使该字段或该组字段中的值唯一,可以为空,但是,不能重复。Constraint constraint_name unique(column)

select userenv('language') from dual ?查看字符集,结果:SIMPLIFIED CHINESE_CHINA.AL32UTF8。

trunc:

TRUNC(n1[,n2] 返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上。

Eg: selecttrunc(24.546),trunc(24.546,2),trunc(24.546,3),trunc(24.546,-1),trunc(24.546,-2),trunc(2345.2,-3)from dual;

结果:

在数据库中如何查询当天的数据

查询当天的数据的方法是:

select *

from tabname

where trunc(dtcol) = trunc(sysdate)

或者:

select *

from tabname

where dtcol = trunc(sysdate) and dtcol trunc(sysdate) + 1

如何处理数据库的时间

oracle为例吧:

1.分钟转成不同格式的时间

数据库里有个字段 存的分钟

① 现在想显示成HH:MM格式 假设为514分钟

SELECT to_char((to_date('00:00','HH24:MI')+514/24/60),'HH24:MI') from dual

输出结果:

08:34

②如果存的是秒 同理

SELECT to_char((to_date('00:00:00','HH24:MI:SS')+514/24/60/60),'HH24:MI:SS') from dual

输出结果:

00:08:34

至于显示成其他的格式,也就不成问题了

2.时分相加

至于为什么要写这个,是因为Oracle里没有两个时间相加的处理,两个to_date相减可以,相加就出错了:

数据库里有两个字段 存的都是HH:MM格式的时间

假设一个是本月上午缺勤时间合计: 08:30(8个半小时)

另外一个是本月下午缺勤时间合计: 00:30(半小时)

现在想要总缺勤时间,显示成 HH:MM格式

做法有两种

① 正常的逻辑运算(代码或者PLSQL实现的应该比这个容易的多,仅限于SQL实现):

select LPAD((substr('08:30',1,2) + substr('00:30',1,2)+(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60),2,'0') || ':' || LPAD(mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60),2,'0') from dual

看起来很复杂,而实际上就是把小时相加,分钟相加,之后把分钟满60的小时进位,取余的显示:

取前两位相加得小时:(是因为不确定数据储存的格式是不是严格的HH:MM,而不能借正则分隔“:”)

(substr('08:30',1,2) + substr('00:30',1,2)

取后两位相加得分钟:

(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))

把分钟满60的小时进位得显示用的小时: (substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60

现在小时算完了,不足两位左补零:

LPAD((substr('08:30',1,2) + substr('00:30',1,2)+(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60),2,'0')

把分钟取余得显示用的分钟:

mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60)

现在分钟算完了,不足两位左补零: LPAD(mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60),2,'0')

最后连上“:”就变成上述的SQL,得到的时间用HH:MM显示了

输出结果:

09:00

②函数实现:

SELECT to_char(to_date('00:00','HH24:MI') +(((to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))) *24*60 + (to_date('00:30','HH24:MI') - trunc(to_date('00:30','HH24:MI'))) *24*60)/24/60),'HH24:MI') from dual

同样看起来很复杂

首先把HH:MM的换成数值:

to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))

输出结果:.354166666666666666666666666666666666666(其实是代表了一个时间,是以天为单位的)

现在*24*60 把数值换成分钟:

(to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))) *24*60

输出结果:510

也就是把08:30 变成了510分

(to_date('00:30','HH24:MI') - trunc(to_date('00:30','HH24:MI'))) *24*60

输出结果:30(时间是.020833333333333333333333333333333333333)这两个

也就是把00:30 变成了30分

然后把两个分钟相加:

((to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))) *24*60 + (to_date('00:30','HH24:MI') - trunc(to_date('00:30','HH24:MI'))) *24*60)

输出结果:540

剩下的就是显示处理了,和1里面的做法一致:

to_char(to_date('00:00','HH24:MI') +(((to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))) *24*60 + (to_date('00:30','HH24:MI') - trunc(to_date('00:30','HH24:MI'))) *24*60)/24/60),'HH24:MI')

输出结果:

3. 不论是方法①还是方法②,这里都存在一个问题:如果时间相加之后超出23:59,系统就会报错,目前我用的涉及不到这个 就没写出来,如果有用到的直接再转成DD:HH:MM的格式就行了,也就是把小时数满24的进位取显示用的天

SELECT to_char(to_date('01 00:00','DD HH24:MI') +(((to_date('23:30','HH24:MI') - trunc(to_date('23:30','HH24:MI'))) *24*60 + (to_date('01:30','HH24:MI') - trunc(to_date('01:30','HH24:MI'))) *24*60)/24/60-1),'DD HH24:MI') from dual

输出结果:01 01:00(25小时)

oracle 时间相减

select to_char((TO_DATE('1970-01-01', 'yyyy-MM-dd') +

(to_date('10:10:10', 'HH24:mi:ss') -

to_date('12:10:10', 'HH24:mi:ss'))), 'HH24:mi:ss')

from dual;

对当前日期增加50分种

SQL select sysdate, sysdate+numtodsinterval(50,’minute’) from dual ;

SYSDATE SYSDATE+NUMTODSINTE

——————- ——————-

2010-10-14 21:39:12 2010-10-14 22:29:12

对当前日期增加45秒

SQL select sysdate, sysdate+numtodsinterval(45,’second’) from dual ;

SYSDATE SYSDATE+NUMTODSINTE

——————- ——————-

2010-10-14 21:40:06 2010-10-14 21:40:51

对当前日期增加3天

SQL select sysdate, sysdate+3 from dual ;

SYSDATE SYSDATE+3

——————- ——————-

2010-10-14 21:40:46 2010-10-17 21:40:46

对当前日期增加4个月

SQL select sysdate, add_months(sysdate,4) from dual ;

SYSDATE ADD_MONTHS(SYSDATE,

——————- ——————-

2010-10-14 21:41:43 2011-02-14 21:41:43

对当前日期增加一个小时:

SQL select sysdate, sysdate+numtodsinterval(1,’hour’) from dual ;

SYSDATE SYSDATE+NUMTODSINTE

——————- ——————-

2010-10-14 21:38:19 2010-10-14 22:38:19

对当前日期增加50分种

Oracle 数据库to_charc(trunc(sysdate,'mm')-1),'yyyymmdd')转化为SQLser语句

ORACLE中TRUNC是截取的函数

用在日期类型上,就是截取到日或时间

SELECT TRUNC(SYSDATE) FROM DUAL;

默认是截取系统日期到日,得到2012-12-19

比如值为"2012-12-19 14:30:50"的日期变量

TRUNC(SYSDATE)得到 2012-12-19 , 和TRUNC(SYSDATE,'DD')一样

TRUNC(SYSDATE,'YYYY'),得到2012-1-1

TRUNC(SYSDATE,'MM'),得到2012-12-1

TRUNC(SYSDATE,'DD'),得到2012-12-19

TRUNC(SYSDATE,'HH')或HH24,得到2012-12-19 14:00:00

TRUNC(SYSDATE,'MI'),得到2012-12-19 14:30:00

TRUNC(SYSDATE,'SS'),是会报错的,直接用SYSDATE不用TRUNC

另外说明一下,截取后得到的仍为date数据类型

oracle数据库,查询到的结果怎样修改?

在把Oracle查询结果转换为SQL Server的时候要特别当心一些不容易注意到的问题。

我们知道,T-SQL是SQL Server的语言引擎,而Oracle的语言引擎却是PLSQL.这两种查询语言都对

ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明,同时还要介绍下如何

对这些扩展进行转化以用在SQL Server环境下。

列的选择

用PLSQL执行数据查询的时候,FROM子句是必须的,这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表DUAL.DUAL表由

Oracle连同数据字典一同创建,所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY,该列定义为VARCHAR2

(1)类型,有一行值X.

从DUAL表选择数据常被用来通过SELECT语句计算常数表达式,由于DUAL只有一行数据,所以常数只返回一次。

Oracle下的DUAL查询如下所示:

SELECT

‘x’ FROM dual

而对等的SQL Server查询则是下面这个样子:

SELECT ‘x’

连接

Oracle用|| 符号作为连接符,而SQL Server的连接符是加号:+ .

Oracle查询如下所示:

Select ‘Name’ || ‘Last Name’

From tableName

对应的SQL Server查询如下所示:

Select ‘Name’ + ‘Last Name’

数字取舍

Oracle数据库内有一个TRUNC函数,该函数返回m位十进制数的n位;如果省略m则n就是0位。m的值可以为负,表示截去小数点左边m位数字。

在SQL Server下可以用Round或者Floor.

以下是Oracle查询:

SELECT

TRUNC(15.79,1) "Truncate" FROM DUAL;

下面是同类查询的SQL Server版本:

SELECT ROUND(15.79, 0) rounded ,

ROUND(15.79, 0,1) truncated

SELECT FLOOR(ROUND(15.79, 0)),

FLOOR(ROUND(15.79, 0,1) )

在把Oracle查询转换为SQL Server的时候要特别当心一些不容易注意到的问题。我们知道,T-SQL是SQL Server的语言引擎,而Oracle的语言引擎却是PLSQL.这两种查询语言都对

ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明,同时还要介绍下如何

对这些扩展进行转化以用在SQL Server环境下。

列的选择

用PLSQL执行数据查询的时候,FROM子句是必须的,这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表DUAL.DUAL表由

Oracle连同数据字典一同创建,所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY,该列定义为VARCHAR2

(1)类型,有一行值X.

从DUAL表选择数据常被用来通过SELECT语句计算常数表达式,由于DUAL只有一行数据,所以常数只返回一次。

Oracle下的DUAL查询如下所示:

SELECT

‘x’ FROM dual

而对等的SQL Server查询则是下面这个样子:

SELECT ‘x’

连接

Oracle用|| 符号作为连接符,而SQL Server的连接符是加号:+ .

Oracle查询如下所示:

Select ‘Name’ || ‘Last Name’

From tableName

对应的SQL Server查询如下所示:

Select ‘Name’ + ‘Last Name’

oracle中trunc(sysdate-1)是什么意思

trunc(sysdate)

就是取得当天的0时0分0秒的日期时间

sysdate

-

trunc(sysdate)

就是当前日期时间

0时0分0秒的

日期时间

的时间差(以天为单位)

(责任编辑:IT教学网)

更多

推荐新手入门文章